關(guān)于自執(zhí)行函數(shù)(立即執(zhí)行函數(shù))

tips:接下去會在github寫博客,簡書不再更新和修改文章,歡迎大家逛逛我的新博客點擊查看 ,我會盡量用更容易理解的方式寫好每一篇博客,大家一起學習交流??。

什么是自執(zhí)行函數(shù)?

一下有三種寫法

1.最前最后加括號

(function(){alert(1);}()); 

這種方法好處是能提醒閱讀代碼的人,這段代碼是一個整體。 壞處是前面的代碼行后記得加分號,不然會報錯。如:

var a=1 
(function(){alert(1);}()); 

2.function外面加括號

(function(){alert(1);})(); 

這種做法比方法1少了一個代碼整體性的好處.

3.function前面加運算符,常見的是!與void 。

!function(){alert(1);}(); 
void function(){alert(2);}();

顯然,加上“!”或“+”等運算符,寫起來是最簡單的。加上“void ”要敲五下鍵盤,但是聽說有一個好處是,比加"!"少一次邏輯運算。

網(wǎng)上的圖
  • 首先聲明一個匿名函數(shù) function(){alert('我是匿名函數(shù)')}。
  • 然后在匿名函數(shù)后面接一對括號 (),調(diào)用這個匿名函數(shù)。

自執(zhí)行函數(shù)的作用

創(chuàng)建一個獨立的作用域,這個作用域里面的變量,外面訪問不到(即避免「變量污染」)

例子來看一個著名的面試題:

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  liList[i].onclick = function(){
    alert(i) // 為什么 alert 出來的總是6,而不是0、1、2、3、4、5
  }
}

為什么 alert 的總是 6 呢?

因為 i 是貫穿整個作用域的,而不是給每個li 分配了一個i,如下:

也是網(wǎng)上的圖

那么怎么解決這個問題呢?

用立即執(zhí)行函數(shù)給每個li創(chuàng)造一個獨立作用域即可(當然還有其他辦法):

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  !function(ii){
    liList[ii].onclick = function(){
      alert(ii) // 0、1、2、3、4、5
    }
  }(i)
}

在立即執(zhí)行函數(shù)執(zhí)行的時候,i 的值被賦值給 ii,此后 ii 的值一直不變。i 的值從 0 變化到 5,對應(yīng) 6 個立即執(zhí)行函數(shù),這 6 個立即執(zhí)行函數(shù)里面的 ii 「分別」是 0、1、2、3、4、5。

(整理自網(wǎng)絡(luò))

最后編輯于
?著作權(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)容