JavaScript中神奇的setTimeout延时0毫秒
2019-07-31 本文已影响0人
LilyLaw
先上个例子,大家猜一猜,执行结果是怎样的呢?
console.log(1);
setTimeout(()=>{
console.log(2);
},0);
console.log(3);
应该有人会想:0毫秒延时就是不延时,按顺序执行,所以结果是:1、2、3
但是真正运行结果如下:
Node环境下运行结果 火狐浏览器运行结果
原因是什么呢?
js运行机制背景
JavaScript是单线程的,意思是JavaScript在某一时刻只能干一件事。跟Java对比,Java可以分出好几个线程分别去处理不同的事情最后再汇总结果。
但JavaScript这种单线程机制也会导致一些问题:如果程序执行到某个地方,很耗时阻塞了,那么下面的东西也就无法执行了,因为它会一直卡在这个地方,等它执行完。
为了解决阻塞这个问题,异步回调函数就产生了。
如上例:setTimeout 会告诉JavaScript引擎,里面要执行的东西是耗时的,会发生阻塞。JavaScript引擎就会把里面的东西放到事件队列的最尾部。等不异步的代码执行完了(比如上面的例子中:console.log(1);console.log(3)),这时候就去执行事件队列中的东西。所以最后结果就是 1、3、2
关于事件队列,em。。。比较晦涩难懂,大家先不要过分纠结于搞清楚他里里外外到底是个啥,只需要知道他的作用就可以了:JavaScript引擎把异步的代码放入事件队列中,等不异步的代码执行完了,就按照顺序执行事件队列中的代码。em。。。这就是我的理解。