1

私は現在、次の関数を使用して、イベントループで関数呼び出しをキューに入れています。

Function.prototype.async = function () {
    setTimeout.bind(null, this, 0).apply(null, arguments);
};

これにより、次のようなコードを記述できます。

alert.async("This will be displayed later.");
alert("This will be displayed first.");

今、私が書いているライブラリにこの関数を含めることを計画しています。ただし、名前asyncは関数の説明が不正確なようです。技術的には、関数は非同期で実行されていません。

だから私の質問は、によって実行される関数setTimeoutが非同期でない場合、それは何ですか?どのように説明しますか?

より適切な名前になると思いますdeferが、よくわかりません。

4

2 に答える 2

2

ECMAscriptコードは、任意のブラウザ実装内で実行されている、このようないわゆるUIスレッドで実行されます。基本的に、すべてのUI更新Javascriptコードブロックはそのスレッド内で共有されます(これが、Javascriptコードを長時間実行するとブラウザーのUIがハングする理由でもあります)。

ただし、そのUIスレッドへの関数の挿入setTimeoutキューに入れるだけです。つまり、コードが実際にxxxミリ秒で実行されるという保証はなく、キューにプッシュされるだけです。他のプロセスがまだ実行中の場合、またはブラウザがスレッド内でビジー状態の場合、他のプロセスが処理されるまでブラウザは実行されません。

私はそれをどのように呼びますか?

「ECMAscriptコードの実行の延期」

于 2013-03-11T12:08:56.173 に答える
0

最初の呼び出しが終わった後(連続して)実行されます、

そして、を使用してバインドしset-timeout、最初のイベントの後に開始します。

したがって、同期(結合/フロー中)であり、

私はここで理にかなっていると思います:)

于 2013-03-11T12:09:24.720 に答える