JavaScriptマクロタスクとマイクロタスク

2112 ワード

最近オーディエンスに一つの問題を聞きました.モニターとタイマーの二つの性能の問題について、オーディエンスはマクロタスクとマイクロタスクの概念を普及させてくれました.
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、promise 1、promise 2、setTimeout
そこで、JavaScriptの実行メカニズムを解除しました.JavaScriptのイベントサイクル、同期、非同期は多く言いません.今日はマクロタスクとマイクロタスクを共有します.
まず二つの概念を覚えます.
宿主環境が提供するマクロタスクといい、言語標準が提供するマイクロタスクといいます.これは比較基準として計算しても良い記憶の区分マクロタスクとマイクロタスクです.
宿主環境:
簡単に言えば、javascriptを完璧に動作させる環境であり、javascriptのキャリヤーを完璧に実行できる限り、javascriptの宿主環境である.現在よく見られている二種類の宿主環境はブラウザとnodeがあります.
windowは私たちがずっと使っているグローバルオブジェクトだと知っていますが、実はglobalはjavascriptが運行している時に宿主環境が提供するグローバルオブジェクトで、nodeが生まれる前にこの対象はずっと概念の中に存在しています.nodeの出現に至って、私達は本当にglobalを見ました.
globalはjavascript実行時に宿主環境が提供するグローバルオブジェクトであり、ブラウザではglobalオブジェクトは実現されず、windowオブジェクトを通してglobalオブジェクトを指し、globalの代わりにグローバルオブジェクトとなる.ブラウザが一連の操作DOM、Location、HistoryなどのAppを暴露してjavascriptの呼び出しに供するため、これらの操作対象はglobalの中に存在しないのです.nodeにとって、DOMのこれらの操作はいらないです.javascriptの原音機能だけを使います.
ホスト環境内のすべてのインラインまたはカスタム変数/関数は、グローバルオブジェクトの属性/メソッドであり、ホスト環境によって提供されるマクロタスクとも呼ばれます.
言語基準:
JavaScriptはプログラミング言語であることは知っていますが、JavaScriptはECMAによって標準化されています.ECMAScriptと呼ばれています.だから、言語標準によって提供されるのはマイクロタスクです.例えばES 6に提供されるプロミスです.
上記のコードに戻ります.プロミセはES 6言語の標準で提供されています.タイマーはホスト環境から提供されていますので、プロミセはタイマーより早く実行されます.
もちろん、ブラウザによって環境が違います.この2つの概念に対しては、同じコードが異なるブラウザで実行されます.異なるブラウザでも順番が異なります.深く研究したいなら、自分で調べてみてもいいです.
転載先:https://juejin.im/post/5c8f58e86fb9a070ff3c99b1