【发布时间】:2017-05-20 18:44:00
【问题描述】:
var funcs=[];
for(var i=0;i<3;i++){
funcs[i]=function(){
console.log(i);
};
}
for(var j=0;j<3;j++){
funcs[j]();
}
这样,我知道它会提醒3所有。因为函数是在我被分配到3之后被调用的。
但在下面的代码中,我无法理解为什么会发生这种情况。
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 2000);
}
在我看来,当 i 被赋值为 0 时,第一个函数 setTimeout 将在 i 被赋值为 1 之前执行。
这个循环的顺序我错了吗?
【问题讨论】:
-
您得到 3x3 的原因完全相同。 “第一个函数 setTimeout 将在 i 赋值为 1 之前执行。” 不,所有函数都在循环终止后执行,此时
i的值为3。循环不会等待超时。这实际上从您在未来 2 秒 once 获得所有 3 个函数的输出这一事实中可以明显看出。每个输出之间没有 2 秒的延迟。 -
“3x3”是什么意思?为什么'所有函数都在循环终止后执行'?
标签: javascript jquery loops closures