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)算。

- 首先聲明一個(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,如下:

那么怎么解決這個(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ò))