先看一段代码
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.
网友评论