- 閉包定義,作用
閉包就是能夠讀取其他函數內部變量的函數。
作用:一個是可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中
缺點:閉包會保存函數中的變量在內存中,導致內存消耗大
閉包會在父函數外部改變父函數內部變量的值
- 閉包與異步執行函數
前端使用異步執行的情況有
a 定時任務:setTimeOut() setInterval()
b 網絡請求:ajax請求 動態<img>加載
c 時間綁定
當遇到異步的情況時,函數的輸出結果:
for(var i = 1; i <= 5;i++){
setTimeout(function timer(){
console.log( i );
},i * 1000);
} //輸出結果是6 6 6 6 6 6
因為,當執行setTimeOut()時,會暫時跳過這一段,放在緩沖區,當for循環執行結束之后,由於i是全局變量,此時在執行console.log( i )就會是 6,而不是預期中的0 1 2 3 4 5,解決辦法通常有兩種一是使用ES6中let使for循環中的變量變成塊兒作用域,二就是使用立即執行函數,通過函數作用域可以保存變量的特性來將每次循環的變量 i 保存到函數中。
使用let:
for( let i = 0; i <= 5; i++){
setTimeout( function timer(){
console.log( i );
},i * 1000);
}// 輸出結果 0 1 2 3 4 5
使用立即執行函數(IIFE):
for(var i = 0; i <= 5; i++){
(function(){
var j = i;
setTimeout( function timer(){
console.log( j );
}, j * 1000);
})();
}//輸出結果0 1 2 3 4 5