为什么这个10的答案?

时间:2013-09-04 19:46:34

标签: javascript

我知道结果是10:

var es = [];
for (var i = 0; i < 10; i++) {
  es[i] = function () {
    console.log(i);
  };
}
es[6]();

任意数量的es [0] -es [9]仍然是10.但为什么呢?

4 个答案:

答案 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为假时停止,即i10时。之后你有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.