天天看點

javascript 模仿塊級作用域javascript沒有塊級作用域立刻執行函數

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中沒有塊級作用域,隻有函數作用域,為了隔離隻能将變量放在函數中,而為了這個函數能執行并且簡單,那最好的情況就是這個函數能自動執行,是以就有了立刻執行函數…….

繼續閱讀