JS中定时器线程理解

最近在准备面试,对于JS原理性的文章,感受颇有必要系统整理下,没必要每一次都要查询资料,节约时间。面试

问题spa

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

你们以为这个定时器定时时间设为0,有意义吗?是否以为上述代码效果等同于线程

console.log("开始执行定时器回调: "+ new Date())
console.log("我是定时器")

实践是检验真理的最好途径。咱们不排斥拿来主义,可是若是能本身实践验证,对于提高自身格物致知的精神颇有裨益。针对上述问题,咱们用两个实验来解开答案:
实验一:code

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

打印结果队列

clipboard.png

实验二:事件

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

打印结果ip

clipboard.png

经过上述两个实验结果,咱们能够得知 定时器定时为0时,JS执行到定时器这一步,并非直接开始执行定时回调,而是执行了后续代码以后,才执行。it

那为何会这样呢?
咱们仍然拿两个例子来讲明:
实验三:io

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())

打印结果:console

clipboard.png

从结果中能够看出,从定时器线程开始定时,到定时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())

打印结果:

clipboard.png

从结果中能够看出,从定时器线程开始定时,到定时5秒结束后,将定时回调事件放入事件队列中执行,用了9秒。

两次结果不一致,是由于JS代码执行到定时器时,此时定时器线程开始定时,定时时间到以后,将定时回调事件推入事件队列最后,JS线程依据事件队列中顺序执行。而之因此有的延时5秒,有的延时9秒,是由于若是定时器开始计时时,JS事件队列中执行剩余的事件小于5秒,则定时结束后,将定时回调事件推入队列中,JS可以当即执行定时回调事件,因此是5秒;而若是JS事件队列中执行剩余的事件大于5秒,那么在定时结束后,将定时回调事件推入队列后,还需一些时间来执行定时回调事件以前的事件,因此为9秒。

clipboard.png

相关文章
相关标签/搜索