創建閉包(closures)的方式:在一個函數內部創建另一個函數
閉包:函數內部的函數有權訪問函數作用域的變量
實例1:
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 10);
}
分析:輸出結果爲10次10。setTimeout函數是異步函數,會在當前的調用棧完成後執行,即循環完成之後執行。閉包內部引用的是外部變量i,i的值爲10,因此,輸出結果都是10;
實例2:
for(var i = 0; i < 10; i++) {
setTimeout((function(num) {
console.log(num);
})(i), 10)
}
分析:通過創建IIFE(自執行函數表達式)讓結果輸出1-9;
它會創建一個作用域,將i傳遞進去。此時,i是一個局部變量,(不再是在閉包中引用i)。
實例3:
function createFunctions(){
var result=[];
for (var i = 0; i < 10; i++) {
result[i]=function(){
return i;
};
}
return result;
}
var arr=createFunctions();
console.log(arr);
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]());
}
分析:結果爲10次10;實例四:
function createFunctions(){
var result=[];
for (var i = 0; i < 10; i++) {
result[i]=(function(num){
return num;
})(i);
}
return result;
}
var arr=createFunctions();
console.log(arr);
分析:輸出結果爲[0,1,2,3,4,5,6,7,8,9];
歡迎指正!