for循环中setTimeout函数的返回值

时间:2015-06-18 11:05:57

标签: javascript

大家好,当我执行这段代码时,我在控制台日志中得到40可以解释一下为什么

for (var i = 0; i < 10; i++) {
    setTimeout(function () {
        console.log(i);
    }, 300000)
};

3 个答案:

答案 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