浏览器如何确定调用函数的顺序?

时间:2017-10-10 22:00:42

标签: javascript

给出以下示例:

  for(var i=1;i<=5;i++){
    setTimeout(function timer(){
      console.log(i)
    }, 0);
    console.log(i);
  }

打印出来:

1
2
3
4
5
6
6
6
6
6

setTimeout不会立即执行,而是在循环结束后执行,尽管console.log在循环内每次迭代都立即执行。

我对此做了一些研究,但是我能找到的大部分信息表明尽管setTimeout中的匿名函数被添加到JavaScript执行的任务队列中,但它不一定立即被调用。

我的问题是浏览器如何确定哪些功能在执行方面具有优先权?

1 个答案:

答案 0 :(得分:2)

获得此响应的原因是每次进入循环时都会设置新的超时。

超时被放入堆栈并在循环结束时执行。这可能会使您感到困惑,因为当您在同步代码中的函数内使用函数时,父级会暂停其执行,直到子项完成为止。但是当调用异步函数时(就像setTimeout()),行为是完全不同的。

查看此帖子:Asynchronous vs synchronous execution, what does it really mean?