する
setTimeout(function () { /*logic*/ }, 0);
本当に関数を非同期にしますか?
いいえ、関数を非同期にするわけではありません。関数に時間がかかる場合でも、スレッドがブロックされます。
ただし、setTimeout
この関数をブラウザのイベント キューに配置します。そのため、すでにそのキューにあり、実行を待機している他のすべてのイベントの後に実行されます (タイムアウトを使用していない場合は、スクリプトブロックが終了した後に実行されます) 。
正確にsetTimeout(xxx,0)
は意味がありません。仕様に記載されているように、最小遅延は 4 ミリ秒です。
全体として、タイミングはここで説明したよりも少し複雑ですが、トップレベルの説明としてはこれで十分かもしれません;) 詳細については、John Resig の記事を確認してください。
いいえ、違います。
指定された遅延 (ここではゼロの遅延) で関数をイベント キューに配置するだけです。現在実行のためにキューに入れられている他の関数がある場合、その関数はそれらの背後に配置され、それらの (現在アクティブな関数を含む) 関数が実行されるまで待機する必要があります。
これをテストするには、ethis のようなことができます
console.log( 'start' );
setTimeout(function () {
console.log("timeout");
}, 0);
// some very long running code
console.log( 'end' );
それでも出力が得られます:
始める
終わり
タイムアウト
JavaScriptタイマー全体を説明するのは少し難しいです。これはあなたを助けるかもしれません。
ではない正確に
console.log("1");
setTimeout(function () {
console.log("2");
}, 0);
console.log("3");
おそらく出力が表示されます...
1
3
2
タイムアウトによってコードの実行がブロックされることはありませんが、すべてのブラウザーで最小のタイムアウト遅延が強制されます。