先看一段代碼
function out(){
var arr = {};
for(var i = 0; i < 3; i++) {
arr[i] = function() {
return i;
}
}
return arr;
}
var f = out();
console.log(f[0]());
最終運行結果:3
arr是一個數組,里面的每個元素都是一個函數。f=out(),其實 f 等于 返回的 arr, f[0] 就等于 arr[0], 可以 console.log(f[0].toString()); 打印 f[0] 的定義。打印結果如下:
function () {
return i;
}
執行 f0 的時候,return i,這個 i 應該是多少呢,這就是閉包引用函數外邊的值,這里注意,閉包里的 i 里面保存的是外面 i 的一個引用(參考:David Herman 的《Effective JavaScript》第 11 條)。這是外面的 i 的值是多少呢? 因為 i 是 var 聲明的,整個 function 內有效,每次 for 循環, i 都加 1, 所以最后結果是 3.