for循环使用settimeout的不同行为

时间:2018-04-25 02:32:15

标签: javascript ecmascript-6 console

以下是2个场景

for (var i=0; i<3; ++i)
{
   let num = i;
   setTimeout(function() { alert(num); }, 10);
}

输出系列: 提醒:0,1,2

for (var i=0; i<3; ++i)
{
   // variables introduced in this statement
   // are scoped to the block containing it.
   let num = i;
   setTimeout(function() { alert(num); }, 10);
}

输出系列: 提醒:0,2,1

两个相同的代码,但结果不同。

任何想法???

1 个答案:

答案 0 :(得分:1)

我认为您的问题的答案可能是setTimeout使用非常低超时的性质,以及无保证的排序。

请参阅此链接:https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers

注意这一行:

  

此API不保证计时器将按计划运行。由于CPU负载,其他任务等原因导致延迟。

这意味着根据具体情况,您的相同的代码块确实会输出不同的结果。 setTimeout也不保证您使用的确切时间,尤其是在超时非常低时(例如您选择的10ms)。