先看一段代碼
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會比定時器更早執行。
當然,不同瀏覽器不同環境對於這兩個的概念會有不同,相同的代碼在不同瀏覽器執行會有不同的順序,在不同瀏覽器也會有不同的順序。想要深入研究的可以自行查一查資料。