2

する

setTimeout(function () { /*logic*/ }, 0);

本当に関数を非同期にしますか?

4

4 に答える 4

4

いいえ、関数を非同期にするわけではありません。関数に時間がかかる場合でも、スレッドがブロックされます。

ただし、setTimeoutこの関数をブラウザのイベント キューに配置します。そのため、すでにそのキューにあり、実行を待機している他のすべてのイベントの後に実行されます (タイムアウトを使用していない場合は、スクリプトブロックが終了した後に実行されます)

正確にsetTimeout(xxx,0)は意味がありません。仕様に記載されているように、最小遅延は 4 ミリ秒です。

全体として、タイミングはここで説明したよりも少し複雑ですが、トップレベルの説明としてはこれで十分かもしれません;) 詳細については、John Resig の記事を確認してください。

于 2013-05-15T10:53:11.830 に答える
1

いいえ、違います。

指定された遅延 (ここではゼロの遅延) で関数をイベント キューに配置するだけです。現在実行のためにキューに入れられている他の関数がある場合、その関数はそれらの背後に配置され、それらの (現在アクティブな関数を含む) 関数が実行されるまで待機する必要があります。

これをテストするには、ethis のようなことができます

console.log( 'start' );
setTimeout(function () {
    console.log("timeout");
}, 0);

// some very long running code 
console.log( 'end' );

それでも出力が得られます:

始める

終わり

タイムアウト

于 2013-05-15T10:53:53.570 に答える
0

JavaScriptタイマー全体を説明するのは少し難しいです。これはあなたを助けるかもしれません。

John Resig ブログ: Javascript タイマーのしくみ

于 2013-05-15T10:53:56.990 に答える
0

ではない正確に

console.log("1");
setTimeout(function () {
    console.log("2");
}, 0);
console.log("3");

おそらく出力が表示されます...

1
3
2

タイムアウトによってコードの実行がブロックされることはありませんが、すべてのブラウザーで最小のタイムアウト遅延が強制されます。

于 2013-05-15T10:48:08.483 に答える