JS中定时器线程明白

最近在预备口试,关于JS原理性的文章,认为很有必要体系整顿下,没必要每一次都要查询材料,勤俭时候。

题目

setTimeout(function(){
    console.log("最先实行定时器回调: "+ new Date())
    console.log("我是定时器")
},0)

人人认为这个定时器定常常候设为0,有意义吗?是不是认为上述代码效果等同于

console.log("最先实行定时器回调: "+ new Date())
console.log("我是定时器")

实践是磨练真谛的最好门路。我们不排挤拿来主义,然则假如能本身实践考证,关于提拔本身格物致知的精力很有裨益。针对上述题目,我们用两个试验来解开答案:
试验一:

console.log("1")
console.log("我是定时器")
console.log("2")

打印效果

《JS中定时器线程明白》

试验二:

console.log("1")
setTimeout(function(){
    console.log("我是定时器")
},0)
console.log("2")

打印效果

《JS中定时器线程明白》

经由过程上述两个试验效果,我们可以得知 定时器定时为0时,JS实行到定时器这一步,并非直接最先实行定时回调,而是实行了后续代码以后,才实行。

那为何会如许呢?
我们依然拿两个例子来申明:
试验三:

    console.log("1")
    console.log("定时器线程最先计时: "+ new Date())
    setTimeout(function(){
        console.log("最先实行定时器回调: "+ new Date())
    },5000)
    for(var i=0;i<500;i++){
        console.log("我是轮回")
    }
    console.log("事宜行列末了一名: "+ new Date())

打印效果:

《JS中定时器线程明白》

从效果中可以看出,从定时器线程最先定时,到定时5秒完毕后,将定时回调事宜放入事宜行列中实行,用了5秒。

试验四:

    console.log("1")
    console.log("定时器线程最先计时: "+ new Date())
    setTimeout(function(){
        console.log("最先实行定时器回调: "+ new Date())
    },5000)
    for(var i=0;i<50000;i++){
        console.log("我是轮回")
    }
    console.log("事宜行列末了一名: "+ new Date())

打印效果:

《JS中定时器线程明白》

从效果中可以看出,从定时器线程最先定时,到定时5秒完毕后,将定时回调事宜放入事宜行列中实行,用了9秒。

两次效果不一致,是因为JS代码实行到定时器时,此时定时器线程最先定时,定常常候到以后,将定时回调事宜推入事宜行列末了,JS线程根据事宜行列中递次实行。而之所以有的延时5秒,有的延时9秒,是因为假如定时器最先计常常,JS事宜行列中实行盈余的事宜小于5秒,则定时完毕后,将定时回调事宜推入行列中,JS可以马上实行定时回调事宜,所以是5秒;而假如JS事宜行列中实行盈余的事宜大于5秒,那末在定时完毕后,将定时回调事宜推入行列后,还需一些时候来实行定时回调事宜之前的事宜,所认为9秒。

《JS中定时器线程明白》

    原文作者:Alfred
    原文地址: https://segmentfault.com/a/1190000018226060
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞