這篇文章帶給大家的內容是關於js執行機制的概念? js的執行機制的實作方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
在實際開發中,總是遇到請求結束後,想要把請求得到資料賦值給某一個物件或變量,如果沒有在請求的回調函數中賦值,而是在請求語句下面賦值,我們會發現請求得到資料正常,但是賦值後的變數是undefined。這是為什麼呢?
首先,我們要了解一個概念,就是同步與非同步。眾所周知,js是單執行緒語言,也就是說,js一次只能執行一個任務,如果有多個任務的話呢,那就按照任務的順序依序執行。但如果其中某一個任務耗費大量時間,例如陷入死循環,那麼其他任務都不能執行,就會造成瀏覽器無回應。那麼js是如何解決的呢?那就是將任務分為同步和非同步模式進行執行。同步如上,非同步呢是指,擁有大於一個的回呼函數,任務在執行結束時不是執行下一個任務而是執行回呼函數,那麼有人可能會有疑問,這樣做與同步有什麼區別呢?差別在於,後一個任務不用等前一個任務完全執行後再執行。因此我們得到的程序執行順序不是任務的排列順序。
setTimeout(function(){ console.log('第一个延时调用'); }); console.log('哈哈哈'); new Promise(function(resolve){ console.log('promise任务吗'); resolve(); }).then(function(){ console.log('回调函数???') }); console.log('嘻嘻嘻'); setTimeout(function(){ console.log('第二个延时调用'); });
執行結果是什麼呢?
哈哈哈
promise任務嗎
嘻嘻嘻
回呼函數? ? ?
第一個延時呼叫
第二個延時呼叫
為什麼是這樣呢?為什麼setTimeout會在最後才執行,明明是0ms啊。
是因為除了同步非同步模式外,我們對任務還有進一步的劃分,宏任務和微任務。
巨集任務:包含整體程式碼script,setTimeout,setInterval
微任務:Promise,process.nextTick
在執行時,進入巨集任務後,開始第一次循環,接著執行所有微任務,然後在進行宏任務的下次循環。
在上面程式碼中,進入巨集任務,並將setTimeout註冊為巨集任務放入佇列,接著執行哈哈哈,遇到new Promise 直接執行,回呼函數放置微任務佇列,接著執行嘻嘻嘻,第二個setTimeout如上。接著執行微任務,這裡僅有嘻嘻嘻。最後進入下次宏任務。
相關推薦:
以上是js執行機制的概念? js的執行機制的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!