関数 (リテラル) を関数 fireEvent に渡していますが、その fireEvent はおそらくある時点で呼び出します... しかし、fireEvent が正確に何をするかを知るために、fireEvent のコードを貼り付けていません。また、fireEvent() はどのように呼び出されますか? ループで1000回呼び出されていますか?
今のところ、次の例が何が起こっているのかを理解するのに役立つことを願っています。
function foo() {
console.log( 'first' );
setTimeout( ( function(){ console.log( 'second' ); } ), 100 );
}
for (var i = 0; i < 1000; i++) {
foo();
}
これにより、'first' が 1000 回出力され、次に 'second' が 1000 回出力されます。
この場合、何が起こっているかはかなり明白なはずです: for ループは 100 秒のタイムアウト期間未満で完了するため、foo() への各呼び出しは 'first' を出力し、'second' を出力するコールバックが取得する前に戻ります。実行するチャンス。
ただし、これは興味深い点です。タイムアウト期間が非常に短く (たとえば 5 ミリ秒)、ループが 100 万回実行されたとしても、「最初に」100 万回印刷され、続いて「2 番目」が 100 万回印刷されます。回。(ループの実行に 5 ミリ秒以上かかる場合がありますが)。
function foo() {
console.log( 'first' );
setTimeout( ( function(){ console.log( 'second' ); } ), 5);
}
for (var i = 0; i < 1000000; i++) {
foo();
}
これは、setTimeout がコールバックが呼び出されるまでの最小期間のみを設定するために発生します。JavaScript はシングルスレッドです。イベントが発生した場合 (またはコールバックのタイムアウト期間がタイムアウトした場合)、何も起こっていない場合、つまりイベント ループがアイドル状態の場合、そのハンドラーが実行されます。ただし、タイムアウトが発生し、javascript イベント ループがビジー状態の場合、イベント ループが自由に実行できるようになるまで、コールバック (および処理の準備が整った後続のイベントなど) がキューに入れられます。
お役に立てれば。