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

tips:接下去會(huì)在github寫(xiě)博客,簡(jiǎn)書(shū)不再更新和修改文章,歡迎大家逛逛我的新博客點(diǎn)擊查看 ,我會(huì)盡量用更容易理解的方式寫(xiě)好每一篇博客,大家一起學(xué)習(xí)交流??。

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

一下有三種寫(xiě)法

1.最前最后加括號(hào)

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

這種方法好處是能提醒閱讀代碼的人,這段代碼是一個(gè)整體。 壞處是前面的代碼行后記得加分號(hào),不然會(huì)報(bào)錯(cuò)。如:

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

2.function外面加括號(hào)

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

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

3.function前面加運(yùn)算符,常見(jiàn)的是!與void 。

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

顯然,加上“!”或“+”等運(yùn)算符,寫(xiě)起來(lái)是最簡(jiǎn)單的。加上“void ”要敲五下鍵盤(pán),但是聽(tīng)說(shuō)有一個(gè)好處是,比加"!"少一次邏輯運(yùn)算。

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

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

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

例子來(lái)看一個(gè)著名的面試題:

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

為什么 alert 的總是 6 呢?

因?yàn)?i 是貫穿整個(gè)作用域的,而不是給每個(gè)li 分配了一個(gè)i,如下:

也是網(wǎng)上的圖

那么怎么解決這個(gè)問(wèn)題呢?

用立即執(zhí)行函數(shù)給每個(gè)li創(chuàng)造一個(gè)獨(dú)立作用域即可(當(dā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í)行的時(shí)候,i 的值被賦值給 ii,此后 ii 的值一直不變。i 的值從 0 變化到 5,對(duì)應(yīng) 6 個(gè)立即執(zhí)行函數(shù),這 6 個(gè)立即執(zhí)行函數(shù)里面的 ii 「分別」是 0、1、2、3、4、5。

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

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

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

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