看一个简单的例子: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会有很大的精度问题。