2 回答
TA貢獻1795條經驗 獲得超7個贊
var 存在變量提升,所以你寫的
for(var i = 0; i < 10; i++){
arr[i] = function(){
return i;
};
}
等同于
var i
for(i = 0; i < 10; i++){
arr[i] = function(){
return i;
};
}
實際上就是定義了一個全局變量。
雖然你return的是i,但是你在調用arr[i]這個函數的時候,會沿著作用域鏈找到arr[i]這個函數的上一層作用域,在這里即是全局作用域。所以你調用的時候var已經是10了,可以在 for循環后面添加一個console.log(i)驗證。
let 會創建一個作用域。則,這里就會形成一個閉包
所以,使用let定義時,則分成了三層 Global --> Closure --> Local 作用域
所以你在調用arr[i]這個函數時,其實會根據作用域鏈找到Closure(閉包)中的 變量 i 。
使用下面這行代碼,打開瀏覽器中的Source面板并查看右側的Scope(作用域鏈)驗證。
var arr = []
for(let i = 0 ;i<10 ;i++){
arr[i] = function(){
debugger
console.log(i);
};
}
for(var j = 0; j < arr.length; j++){
console.log(arr[j]());
}//0-9
ps:個人理解,如有錯誤,希望指出
添加回答
舉報
