国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS中定時器線程理解

tuniutech / 2019人閱讀

摘要:兩次結果不一致,是因為代碼執行到定時器時,此時定時器線程開始定時,定時時間到之后,將定時回調事件推入事件隊列而最后,線程依據事件隊列中順序執行。

最近在準備面試,對于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")

打印結果

實驗二:

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

打印結果

通過上述兩個實驗結果,我們可以得知 定時器定時為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())

打印結果:

從結果中可以看出,從定時器線程開始定時,到定時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())

打印結果:

從結果中可以看出,從定時器線程開始定時,到定時5秒結束后,將定時回調事件放入事件隊列中執行,用了9秒。

兩次結果不一致,是因為JS代碼執行到定時器時,此時定時器線程開始定時,定時時間到之后,將定時回調事件推入事件隊列最后,JS線程依據事件隊列中順序執行。而之所以有的延時5秒,有的延時9秒,是因為如果定時器開始計時時,JS事件隊列中執行剩余的事件小于5秒,則定時結束后,將定時回調事件推入隊列中,JS能夠立即執行定時回調事件,所以是5秒;而如果JS事件隊列中執行剩余的事件大于5秒,那么在定時結束后,將定時回調事件推入隊列后,還需一些時間來執行定時回調事件之前的事件,所以為9秒。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101920.html

相關文章

  • javascript引擎執行的過程的理解--執行階段

    摘要:如果對語法分析和預編譯,還有疑問引擎執行的過程的理解語法分析和預編譯階段。參與執行過程的線程分別是引擎線程也稱為內核,負責解析執行腳本程序的主線程例如引擎。以上便是引擎執行宏任務的整個過程。 一、概述 js引擎執行過程主要分為三個階段,分別是語法分析,預編譯和執行階段,上篇文章我們介紹了語法分析和預編譯階段,那么我們先做個簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進行語法...

    SnaiLiu 評論0 收藏0
  • javascript引擎執行的過程的理解--執行階段

    摘要:如果對語法分析和預編譯,還有疑問引擎執行的過程的理解語法分析和預編譯階段。參與執行過程的線程分別是引擎線程也稱為內核,負責解析執行腳本程序的主線程例如引擎。以上便是引擎執行宏任務的整個過程。一、概述 js引擎執行過程主要分為三個階段,分別是語法分析,預編譯和執行階段,上篇文章我們介紹了語法分析和預編譯階段,那么我們先做個簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進行語法檢驗,語...

    Achilles 評論0 收藏0
  • Js基礎知識(四) - js運行原理與機制

    摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...

    LMou 評論0 收藏0
  • Js基礎知識(四) - js運行原理與機制

    摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...

    leap_frog 評論0 收藏0
  • Js基礎知識(四) - js運行原理與機制

    摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...

    shevy 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<