Javascript 为什么答案是10?

Javascript 为什么答案是10?,javascript,Javascript,我知道结果是10: var es = []; for (var i = 0; i < 10; i++) { es[i] = function () { console.log(i); }; } es[6](); var es=[]; 对于(变量i=0;i

我知道结果是10:

var es = [];
for (var i = 0; i < 10; i++) {
  es[i] = function () {
    console.log(i);
  };
}
es[6]();
var es=[];
对于(变量i=0;i<10;i++){
es[i]=函数(){
控制台日志(i);
};
}
es[6]();

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

只创建了整数对象。那些
console.log(i)
都指向内存中的同一对象。
i
——唯一的
i
——的值当然是循环末尾的10

注意,
console.log(i)
行创建了一个闭包,这特别意味着它没有创建对
i
引用的变量的新引用。这是相同的参考


进行此分析的一个好方法是跟踪代码中创建新实际变量的次数。如果你已经用C或C++编程,或者在任何地方编程,你知道一个整数需要4或8字节的内存。该行的
(var i=0;
可以被认为是创建一个对象。只有一个。函数内部没有任何东西创建另一个对象,因为闭包不会创建另一个对象。

因为循环后
i
10
。函数打印
i
的引用,因为您引用的是
i
,循环后它是
10
即,当您执行console.log(i)时,i的值已更改为10。

这是因为当您执行
console.log(i)
时,
i
已随着循环完成而更改

更准确地说,当条件
i<10
为false时,即
i
10
时,
for
循环停止。之后的函数是10相同的函数,都使用相同的外部定义变量
i

您可以使用以下经典的闭包技巧修复它:

var es = [];
for (var i = 0; i < 10; i++) {
   (function(j){
     es[j] = function () {
       console.log(j);
     };
   })(i);
}
es[6]();
var es=[];
对于(变量i=0;i<10;i++){
(职能(j){
es[j]=函数(){
控制台日志(j);
};
})(i) );
}
es[6]();

此代码所做的是创建一个新变量,
j
,其作用域是匿名函数调用。这是一种在调用函数时保存
i
的值的方法(即在循环期间,而不是在调用
es[6]
时).

i
只存在一次,只能保留1个值。毕竟
i++
,它将是
10
。哼,为什么要投否决票?我是这里唯一一个用工作代码回答的人……是的,wyh?这个答案不仅正确地回答了问题,而且为asker的预期行为提供了有效的代码示例。我只会改进make是将参数名从
i
更改为避免混淆。否则我觉得很好。为什么答案不是9?因为它的i<10。另外,我不明白为什么如果它在for循环中,它只打印一次。你能解释一下这些事情吗?当我