Javascript 为什么答案是10?
我知道结果是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
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循环中,它只打印一次。你能解释一下这些事情吗?当我