setTimeout解读

看一个简单的例子:javascript

1 for(var i=0; i<4; i++){
2   setTimeout(function(){console.log(i)}, 0);
3 }

请问下这段代码会输出什么呢?java

若是你以为输出:多线程

1函数

2spa

3线程

那你就错了,实际上它会输出code

4blog

4队列

4事件

为何是这个结果呢?这里给出的解释是:Javascript事件处理器是在线程执行完以后才执行事件,继续看下面的例子,你会更清楚:

var start = new Date();
setTimeout(function(){
  var end = new Date();
  console.log('多少秒以后才执行的setTimeout:', end - start, 'ms');
}, 500);
while(new Date() - start < 1000){}

若是按照多线程的思惟定势,咱们可能会以为500毫秒以后函数就会执行,可是实际的结果可能会是:

多少秒以后才执行的setTimeout:1002 ms

若是要详细解释这个结果,咱们可能还要看一下javascript中关于队列的解释。

由于javascript是单线程运行语言,因此当出现上面的代码运行的时候,javascript会先执行循环,把setTimeout事件放到事件队列里面,等待线程空闲,一旦线程空闲了,javascript会从事件队列中的底部堆栈中取出以前注册的事件执行,因此setTimeout会有很大的精度问题。

相关文章
相关标签/搜索