【发布时间】:2016-04-01 05:16:13
【问题描述】:
我有一段 Javascript 代码。
var i, _i, _len, _ref;
_ref = [1, 2, 3];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
i = _ref[_i];
setTimeout((function() {
return console.log(i);
}), 0);
}
它是由一段 Coffeescript 生成的,这就是其中奇怪名称的原因。当您执行代码时,输出将是3 3 3。根据执行结果,执行顺序似乎是:
enter for loop
settimeout 1 with a function
settimeout 2 with a function
settimeout 3 with a function
settimeout 1 execute
settimeout 2 execute
settimeout 3 execute
这与我的理解有点不同。据我了解,for 循环中的setTimeout 是异步运行的。 setTimeout 语句本身可以立即完成。几毫秒后(在我们的例子中为 0),函数将开始在单独的上下文中执行。所以我预期的执行顺序是:
enter for loop
settimeout 1 with a function
settimeout 2 with a function, settimeout 1 execute
settimeout 3 with a function, settimeout 2 execute
settimeout 3 execute
根据 CPU 负载和传递给setTimeout 的函数的复杂性,执行顺序可能与我上面描述的不同。但我的观点是, setTimeout 可以立即开始执行,无需等待 for 循环完成。
希望有人可以帮助澄清。我检查了 MDN 的 setTimeout,但没有得到任何有用的东西。
【问题讨论】:
标签: javascript settimeout execution