大家好,当我执行这段代码时,我在控制台日志中得到40可以解释一下为什么
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 300000)
};
答案 0 :(得分:2)
您在控制台上获得的是id
返回的setTimeout()
。如果再次运行该代码,则可能会获得不同的值。我们无法预测这个id
,它是随机的。
如果要使用setTimeout()
打印0-9中的值,则需要注意范围。
使用bind()
:
console.log('before loop');
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(this.i);
}.bind({
i: i
}), 1000)
}
console.log('after loop');
使用闭包:
console.log('before loop');
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
console.log(i); //<-- parameter i
}, 1000);
})(i); //<-- i from loop scope
}
console.log('after loop');
按递增的超时顺序打印。
console.log('before loop');
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(this.i);
}.bind({
i: i
}), 100 * i); //<-- note `* i`
}
console.log('after loop');
答案 1 :(得分:0)
您的代码将在300.000毫秒后打印10。
尝试将其设置为较短的时间段,您将看到10张打印。
你可能看到的是控制台中的亚麻布。
答案 2 :(得分:0)
当我执行这段代码时,我在控制台日志中得到40个
原因是setTimeout()
将函数从执行队列中移出,只有在JavaScript完成当前执行队列后才会调用它。
Understanding JavaScript Timers