javascript沒有塊級作用域
首先要明确一個問題,javascript沒有塊級作用域,并且有變量提升,具體參考這篇
立刻執行函數
有個經典的問題
function returnFunArr(){
var arr=[];
for(var i=;i<;i++){
arr[i]=function(){
console.log(i);
}
}
return arr;
}
for(var f of returnFunArr()){
f();
}
結果并不是我們預期的每個元素相應輸出值,而是都輸出10,這是因為閉包作用域鍊的問題,有一種解決方案是,讓函數立刻執行,如下
function returnFunArr(){
var arr=[];
for(var i=;i<;i++){
arr[i]=function(num){
return function(){
console.log(num);//這裡多加了括号,立刻執行
}
}(i)
}
return arr;
}
for(var f of returnFunArr()){
f();
}
其實這個很好了解,比如
function f(){
}
f();//f立刻執行
因為f就是一個值,是以我們想将f替換為函數,是以寫成
function (){
console.log("execute...");
}();
但是這樣寫執行錯誤,因為js引擎認為function是個函數的關鍵字,函數後邊不能跟(),但是表達式後邊可以跟(),是以可以将function用()包起來,當作表達式
(function (){
console.log("execute...");
})();
這就是立刻執行函數,英文專業名詞叫
immediately invoked function expression
等等,我們的題目是模仿塊級作用域,為啥提立刻執行函數?
這是因為js中沒有塊級作用域,隻有函數作用域,為了隔離隻能将變量放在函數中,而為了這個函數能執行并且簡單,那最好的情況就是這個函數能自動執行,是以就有了立刻執行函數…….