8

遅延がどのように機能するかを理解しようとしたので、それらすべてでsetTimeout.

this.callbacks;// array of functions reference
this.callbacks.forEach(function(callback){
    window.setTimeout(function(){
          callback(data);
    },0);
});

使用するこの質問からの一例setTimeout

resolve: function (data) {
    this.promise.okCallbacks.forEach(function(callback) {
      window.setTimeout(function () {
        callback(data)
      }, 0);
    });
  },

ループ内の関数呼び出しの違いは何setTimeoutですかcallback();?callback.call();

4

4 に答える 4

13

これを行う理由は、キューで待機している可能性のある他のイベントをトリガーする機会を JavaScript スレッドに与えるためです。

Javascript はシングルスレッドです。イベントがトリガーされた場合、現在実行中のコードが終了したときにのみ実行できます。

ゼロ時間遅延で使用すると、関数呼び出しが新しいコンテキストの一部であり、現在のコード ブロックが終了したsetTimeoutことを JS インタープリターに効果的に伝えます。これは、JS が他のイベントを処理する必要があるかどうかを確認するためcallbackに呼び出す前に機会を利用することを意味します。callback()

これにより、すぐに呼び出されるのが遅くなる可能性callback()がありますが、サイトの全体的なパフォーマンスには適しています。

処理が必要なその他のイベントには、クリック イベントやその他の UI トリガーが含まれます。実行する機会を与えないと、ユーザー インターフェイスが遅くなったり、応答しなくなったりする可能性があります。

于 2013-08-29T11:26:53.233 に答える
2

setTimeout(func,0)すぐには呼び出されません。

コールバックを使用して非同期関数をシミュレートするだけです。

function asyncFunc(callback) {
    console.log("step1");
    setTimeout(callback,0);
    console.log("step2");
}

asyncFunc(function() {console.log("async step")});
/* output:
step1
step2
async step
*/

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

setTimeout() によって実行されるコードは、それが呼び出された関数とは別の実行コンテキストで実行されます

したがって、別の実行コンテキストで実行されますが、実行する前に、javascript はシングルスレッドで実行されているため、現在の実行を終了する必要があります。

別のタスクを実行する前に終了する必要があるため、現在の実行中の時間は関係ありません。

たとえば、タスクの終了前に無限ループがある場合、コールバックは呼び出されません。

于 2013-08-29T11:25:37.150 に答える