美文网首页
JavaScript中神奇的setTimeout延时0毫秒

JavaScript中神奇的setTimeout延时0毫秒

作者: LilyLaw | 来源:发表于2019-07-31 15:35 被阅读0次

    先上个例子,大家猜一猜,执行结果是怎样的呢?

    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。。。这就是我的理解。

    相关文章

      网友评论

          本文标题:JavaScript中神奇的setTimeout延时0毫秒

          本文链接:https://www.haomeiwen.com/subject/xlftdctx.html