摘要:兩次結果不一致,是因為代碼執行到定時器時,此時定時器線程開始定時,定時時間到之后,將定時回調事件推入事件隊列而最后,線程依據事件隊列中順序執行。
最近在準備面試,對于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
摘要:如果對語法分析和預編譯,還有疑問引擎執行的過程的理解語法分析和預編譯階段。參與執行過程的線程分別是引擎線程也稱為內核,負責解析執行腳本程序的主線程例如引擎。以上便是引擎執行宏任務的整個過程。 一、概述 js引擎執行過程主要分為三個階段,分別是語法分析,預編譯和執行階段,上篇文章我們介紹了語法分析和預編譯階段,那么我們先做個簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進行語法...
摘要:如果對語法分析和預編譯,還有疑問引擎執行的過程的理解語法分析和預編譯階段。參與執行過程的線程分別是引擎線程也稱為內核,負責解析執行腳本程序的主線程例如引擎。以上便是引擎執行宏任務的整個過程。一、概述 js引擎執行過程主要分為三個階段,分別是語法分析,預編譯和執行階段,上篇文章我們介紹了語法分析和預編譯階段,那么我們先做個簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進行語法檢驗,語...
摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...
摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...
摘要:定時器線程由于是單線程運行,所以不能抽出時間來計時,只能另開辟一個線程來處理定時器任務,等計時完成,把定時器要執行的操作添加到事件任務隊列尾,等待引擎線程來處理。已經知道了是單線程運行的,也知道中有同步操作和異步操作。 js運行機制 本章了解一下js的運行原理,了解了js的運行原理才能寫出更優美的代碼,提高運行效率,還能解決開發中遇到的不理解的問題。 進程與線程 進程是cpu資源分配的...
閱讀 2838·2021-11-25 09:43
閱讀 995·2021-10-11 10:57
閱讀 2492·2020-12-03 17:20
閱讀 3738·2019-08-30 14:05
閱讀 2431·2019-08-29 14:00
閱讀 2002·2019-08-29 12:37
閱讀 1675·2019-08-26 11:34
閱讀 3218·2019-08-26 10:27