JavaScript宏任務和微任務

原文鏈接:https://www.jianshu.com/p/a697e9bfdaef?tdsourcetag=s_pcqq_aiomsg

先看一段代碼

console.log('script start');

setTimeout(function() {

    console.log('setTimeout');

}, 0);

Promise.resolve().then(function() {    

console.log('promise1');

}).then(function() {    

console.log('promise2');});

console.log('script end');

輸出:script start, script end, promise1, promise2, setTimeout

於是撤出了JavaScript的執行機制,JavaScript的事件循環、同步、異步就不多說了,今天分享的是宏任務和微任務。

先記住兩個概念:

宿主環境提供的叫宏任務,由語言標準提供的叫微任務,這是算比較標準也算比較好記憶的區分宏任務和微任務了。

宿主環境:

簡單來說就是能使javascript完美運行的環境,只要能完美運行javascript的載體就是javascript的宿主環境。目前我們常見的兩種宿主環境有瀏覽器和node。

我們都知道window是我們一直使用的全局對象,但其實global 是 javascript 運行時所在宿主環境提供的全局對象,在node出生前這個對象一直都存在於概念裏。直到node的出現才使我們真正看到了global。

global 是 javascript 運行時所在宿主環境提供的全局對象,在瀏覽器中,沒有實現global對象,而是通過window對象來指向global對象,代替global成爲全局對象。因爲瀏覽器暴露了一系列操作 DOM, Location, History 等 Api 供 javascript 調用,而這些操作對象在global中是不存在的。對於node來說,它不需要DOM這些操作,用到的只是javascript的原聲功能。

宿主環境內所有的內建或自定義的變量/函數都是 global/window 這個全局對象的屬性/方法,而由宿主環境提供的也叫宏任務。

語言標準:

我們都知道JavaScript是一種編程語言,但其實JavaScript由ECMA制定標準,稱之爲ECMAScript,所以由語言標準提供的就是微任務,比如ES6提供的promise。

所以迴歸上面的代碼,promise是ES6語言標準提供的,定時器是宿主環境提供的,所以promise會比定時器更早執行。

當然,不同瀏覽器不同環境對於這兩個的概念會有不同,相同的代碼在不同瀏覽器執行會有不同的順序,在不同瀏覽器也會有不同的順序。想要深入研究的可以自行查一查資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章