我知道结果是10:
var es = [];
for (var i = 0; i < 10; i++) {
es[i] = function () {
console.log(i);
};
}
es[6]();
任意数量的es [0] -es [9]仍然是10.但为什么呢?
答案 0 :(得分:5)
因为循环i
之后是10
。该函数打印i
的引用。
答案 1 :(得分:3)
只创建了整数对象。那些console.log(i)
都指的是内存中的同一个对象。 i
的值 - 唯一的i
- 在循环结束时当然是10。
注意,行console.log(i)
创建了一个闭包,这特别意味着它不会创建对i
引用的变量的新引用。这是相同的参考。
进行此分析的一种好方法是跟踪代码中创建新实际变量的次数。如果您使用C或C ++或其他任何地方编程,则您知道整数需要4或8个字节的内存。行for(var i = 0;
可以被认为是创建一个对象。只有一个。函数内部没有任何内容创建另一个对象,因为闭包不会这样做。
答案 2 :(得分:2)
那是因为当你执行console.log(i)
时,i
在循环结束时已经改变了。
更准确地说,for
循环在条件i < 10
为假时停止,即i
为10
时。之后你有10个相同的函数,都使用相同的外部定义变量i
。
你可以使用这个经典的闭包技巧来修复它:
var es = [];
for (var i = 0; i < 10; i++) {
(function(j){
es[j] = function () {
console.log(j);
};
})(i);
}
es[6]();
此代码的作用是创建一个新变量j
,其范围是匿名函数调用。这是一种在调用函数时保存值i
的方法(在循环期间而不是在调用es[6]
时)。
答案 3 :(得分:1)
因为你指的是i
而在循环之后它是10
,即当你执行console.log(i)时。 i的值已更改为10.