2016-08-29 6 views
0

を、コードを入れていない私は、次のコード形式here .Thisサイトは、なぜこの行はのsetTimeoutゼロに設定する理由は、無限再帰ループに

かしらjavascript.Butで非同期コールバック関数とイベントループを説明しようとした取得
timer = setTimeout(arguments.callee, 0) 

遅延なしで実行しているときに再帰的ループを作成しませんでした。settimeoutは何度も呼び出されるため、実際には文が実行されると次のIF文は実行されません。

var i = 0, diff = 0, d = new Date() 

var timer = setTimeout(function() { 
    diff += new Date() - d 
    timer = setTimeout(arguments.callee, 0) 
    if (i++==1000) { 
    clearTimeout(timer) 
    alert("Resolution: "+diff/i) 
    } 
    d = new Date() 
}, 0) 
+1

質問がありません。どうしたの? – eisbehr

+0

「遅延なし」は完全に正しいわけではありません。 [より多くの4-10msの最小遅延のような](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout#Nested_timeouts_forced_to_%3E4ms) – Thomas

+1

私は彼がsetTimeout )、タイマー関数はすぐに実行されるので、コードは決して 'if'ステートメントに到達しません。彼は基本的に、なぜコードが 'if'ステートメントに当たるかを尋ねます。 –

答えて

2

ブラウザでのJavascriptはシングルスレッドです(ブラウザはUIに1つのスレッドを使用するため、コメントは@vldとなります)。非同期操作(およびsetTimeoutのいずれか)は、後で実行されるコードをキューに入れます。現行のスレッドが終了すると(この場合は、行d = new Date())、エンジンは先にキューに入れられたコードを順番にまたは単一のスレッドで実行します。しかし、それまでにタイムアウトがクリアされているため、再び実行されません。

+1

'Javascript is single-threaded.'もっと正確に言えば、ブラウザはUIの実行に1つのスレッドを使います。 – vlaz

関連する問題