匿名自執行函數:沒有方法名的函數
閉包:閉包是指有權訪問另一個函數作用域變量的函數;
通過一個實例來解釋:
從網上找到了一個案例,使用了for循環、匿名自執行函數、setTimeout。
案例1:
var value1 =0,value2=0,value3=0; for(var i =1;i<=2;i++){ var i2 = i; console.log('i2==>',i2); (function(){ var i3 = i; console.log('i3==>',i3); setTimeout(function(){ console.log('i==>',i); console.log('i2==>',i2); console.log('i3==>',i3); value1 +=i; value2 +=i2; value3 +=i3; },1); })(); } setTimeout(function(){ console.log(value1,value2,value3); },100)
//輸出結果 i2==> 1 i3==> 1 i2==> 2 i3==> 2 i==> 3 i2==> 2 i3==> 1 i==> 3 i2==> 2 i3==> 2 6 4 3
解釋:
1.匿名自執行函數的幾種語法
(function () { /* code */ } ()); // 推薦 (function () { /* code */ })(); ~function () { /* code */ }(); +function () { /* code */ }(); !function () { /* code */ }(); void function () { /* code */ }();
2.利用自執行函數和閉包來保存某個特殊狀態中的值
(function(){//自執行函數 var i3 = i; console.log('i3==>',i3); setTimeout(function(){//閉包 console.log('i==>',i); console.log('i2==>',i2); console.log('i3==>',i3); value1 +=i; value2 +=i2; value3 +=i3; },1); })();
自執行函數中的變量會在閉包中調用,根據閉包的特性會將for循環時每次循環的不同值傳入閉包;
3.for循環語法理解
for (語句 1; 語句 2; 語句 3) {
...
}
語句 1 在循環(代碼塊)開始前執行
語句 2 定義運行循環(代碼塊)的條件
語句 3 在循環(代碼塊)已被執行之后執行
通過下面案例進行解析:
for(var i=1;i<3;i++){ console.log(i); setTimeout(function(){ console.log('i===>',i); },100); } //輸出 1 2 i===> 3 i===> 3
for循環的時候,i++會在for語句中代碼結束后執行,而setTimeout是異步執行的,因此在setTimeout中輸出的i實際上是最后一次循環結束后,i再次++后的值。
解釋案例1:
看到這里大家應該明白了,案例一中,第一次循環時,i2 = 1,自執行函數中i3=1,但是閉包可以保存不同狀態的值,因此,此時傳給setTimeout的值只有i3被保存在緩存中,i2,i都將被第二次的循環覆蓋,此時setTimeout並沒有執行;
當第二次循環時,i2=2;i3=2;同樣,i3=2也被保存在閉包中,i2被覆蓋;
此時for循環執行結束,開始執行setTimeout函數,這個時候,for循環結束了,並且執行了最后一個語句“i++”,因此,此時為3,並非2;而閉包外面的i2並沒有將不同的狀態保存在閉包中,只能被覆蓋,而閉包中的i3每次的值都會被閉包緩存在內存中,將狀態保留下來,因此setTimeout中的都為3,i2都為2,而i3則是每次循環的值;
文末福利:
福利一:前端,Java,產品經理,微信小程序,Python等資源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入門與實戰全套詳細視頻教程:https://www.jianshu.com/p/e8197d4d9880

領取方式:
如果需要學習視頻,歡迎關注 【編程微刊】微信公眾號,回復【領取資源】一鍵領取以下所有干貨資源,獲取更多有用技術干貨、文檔資料。所有文檔會持續更新,歡迎關注一起成長!
作者:喜歡坑隊友的程序員
鏈接:https://www.jianshu.com/p/089890d35947
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。