tips
:接下去會在github寫博客,簡書不再更新和修改文章,歡迎大家逛逛我的新博客點擊查看 ,我會盡量用更容易理解的方式寫好每一篇博客,大家一起學習交流??。
什么是自執行函數?
一下有三種寫法
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 ”要敲五下鍵盤,但是聽說有一個好處是,比加"!"少一次邏輯運算。
網上的圖
- 首先聲明一個匿名函數 function(){alert('我是匿名函數')}。
- 然后在匿名函數后面接一對括號 (),調用這個匿名函數。
自執行函數的作用
創建一個獨立的作用域,這個作用域里面的變量,外面訪問不到(即避免「變量污染」)
例子來看一個著名的面試題:
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,如下:
也是網上的圖
那么怎么解決這個問題呢?
用立即執行函數給每個li創造一個獨立作用域即可(當然還有其他辦法):
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)
}
在立即執行函數執行的時候,i 的值被賦值給 ii,此后 ii 的值一直不變。i 的值從 0 變化到 5,對應 6 個立即執行函數,這 6 個立即執行函數里面的 ii 「分別」是 0、1、2、3、4、5。
(整理自網絡)