首頁 >web前端 >js教程 >js執行機制的概念? js的執行機制的實作方法

js執行機制的概念? js的執行機制的實作方法

不言
不言原創
2018-08-11 16:06:031538瀏覽

這篇文章帶給大家的內容是關於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執行機制

以上是js執行機制的概念? js的執行機制的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn