js執行機制

在實際開發中,老是遇到請求結束後,想要把請求獲得數據賦值給某一個對象或者變量,若是沒有在請求的回調函數中賦值,而是在請求語句下面賦值,咱們會發現請求獲得數據正常,可是賦值後的變量是undefined。這是爲何呢?
首先,咱們要了解一個概念,就是同步與異步。衆所周知,js是單線程語言,也就是說,js一次只能執行一個任務,若是有多個任務的話呢,那就按照任務的順序依次執行。可是若是其中某一個任務耗費大量時間,好比陷入死循環,那麼其餘任務都不能執行,會形成瀏覽器無響應。那麼js是如何解決的呢?那就是將任務分爲同步和異步模式進行執行。同步如上,異步呢是指,擁有大於一個的回調函數,任務在執行結束時不是執行下一個任務而是執行回調函數,那麼有人可能會有疑問,這樣作與同步有什麼區別呢?區別在於,後一個任務不用等前一個任務徹底執行後再去執行。所以咱們獲得的程序執行順序不是任務的排列順序。promise

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如上。接着執行微任務,這裏僅有嘻嘻嘻。最後進入下次宏任務。異步

相關文章
相關標籤/搜索