javascript自執(zhí)行函數(shù)

前言

每個函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)在環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈,上下文環(huán)境。因此,在函數(shù)內(nèi)部定義的變量和函數(shù)就只能在函數(shù)內(nèi)部訪問,在外部無法訪問,在該上下文環(huán)境中,調(diào)用函數(shù)時就提供了一個創(chuàng)建私有成員的方式。

自執(zhí)行函數(shù)

在表達式后加上括號會立即執(zhí)行,
但是下面的寫法是錯誤的

function (){}();
function foo(){}();

我們需要這樣寫

(function(){})();
(function(){}());
(function foo(){})();
(function foo(){}());

由于括弧()和JS的&&,異或,逗號等操作符是在函數(shù)表達式和函數(shù)聲明上消除歧義的,所以一旦解析器知道其中一個已經(jīng)是表達式了,其它的也都默認為表達式了,下列的函數(shù)都可以立即執(zhí)行。

//輸出10
var i = function () { return 10; } ();
  console.log(i);   
//輸出test
true && function () { 
  console.log("test");   
}();
 //輸出test
0, function () {
  console.log("test");  
}();

原理

解析器解析全局的function或者function內(nèi)部function關(guān)鍵字的時候,默認是認為function聲明,而不是function表達式,

(function () {} ()); 
(function () {})(); 

大括弧將代碼的代碼全部括住就行了,因為JavaScript里括弧()里面不能包含語句,所以,解析器在解析function關(guān)鍵字的時候,會將相應(yīng)的代碼解析成function表達式,而不是function聲明。

自執(zhí)行的匿名函數(shù)與閉包

for(var i=0;i<10;i++){
  setTimeout(function(){
    console.log(i);
  },1000); 
}

我們希望輸出0~9,但是這段代碼執(zhí)行的結(jié)果是輸出了10個10,原因就是在匿名函數(shù)function(){console.log(i);}中保持對于外部 i 的引用,這個匿名函數(shù)內(nèi)沒有 i ,所以會向上找,此時for循環(huán)完畢,i=10,所以會輸出10個10。

如何修改,改為自執(zhí)行的匿名函數(shù),給自執(zhí)行函數(shù)里面?zhèn)鲄?shù) i,每次傳遞不同的 i

for(var i=0;i<10;i++){
  (function(e){            //e表示i的拷貝
    setTimeout(function(){
      console.log(e);
    },1000)
  })(i); 
}

for(var i=0;i<10;i++){
    setTimeout((function(e){
      return function(){
        console.log(e);
      }
    })(i),1000);
}

參考
http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容