Javascript 为什么计数正确递增

Javascript 为什么计数正确递增,javascript,Javascript,考虑这个简单的例子: var count = 0; for (var i = 0; i < 4; i++ ) { setTimeout(function() { console.log(i, count++); }, i * 200); } 我猜I总是解析为4,因为setTimeout回调在变量I上关闭,但我不明白为什么count的值不为真 var计数=0; 对于(变量i=0;i

考虑这个简单的例子:

var count = 0;
for (var i = 0; i < 4; i++ ) {
    setTimeout(function() {
      console.log(i, count++);
    }, i * 200);
}
我猜
I
总是解析为4,因为setTimeout回调在变量I上关闭,但我不明白为什么
count
的值不为真

var计数=0;
对于(变量i=0;i<4;i++){
setTimeout(函数(){
log(i,count++);
},i*2000);

}
变量
i
for
循环递增,并在任何超时处理程序运行之前以值
4
结束。另一方面,变量
count
仅在超时处理程序中递增。当第一个超时处理程序启动时,
count
仍将是
0

正如前面的小伙子所说,这是因为循环在超时激活之前完成

解决这个问题的一种方法是将超时放在另一个函数中,并从循环中向它传递
i
。这确保了对于每次迭代,函数都会传递正确的
i

这也是
count
设置为预期值的原因;它位于循环的范围之外

for (var i = 0; i < 4; i++) {
    doSomething(i);
};
function doSomething(i) {
    setTimeout(function() {
        console.log(i);
    }, i * 2000);
};
for(变量i=0;i<4;i++){
剂量测定法(i);
};
功能剂量测定(一){
setTimeout(函数(){
控制台日志(i);
},i*2000);
};
for (var i = 0; i < 4; i++) {
    doSomething(i);
};
function doSomething(i) {
    setTimeout(function() {
        console.log(i);
    }, i * 2000);
};