2011-10-26 9 views
3

だから私はsetTimeoutsetIntervalの間に違いがあることを知っているが、これらの2つのコード例を考えてみます。のsetTimeout再び

function myFunction(){ 
    setTimeout('myFunction();', 100); 
    doSomething(); 
} 
setTimeout('myFunction();', 100); 

function myFunction(){ 
    doSomething(); 
} 
setInterval('myFunction();', 100); 

注最初の例では、私はsetTimeoutを呼び出すこと機能の始まりで、次に私はdoSomethingです。したがって、doSomething()から余分な遅延はありません。その2つの例が全く同じことを意味するのでしょうか?それとももっと微妙な違いがありますか?

答えて

11

彼らは、機能的にはほぼ同じだが、違いがあります。 1つの違いは、doSomethingが間隔よりも長くかかる場合、ブラウザがそれを処理する方法です。 setIntervalでは、少なくとも一部のブラウザでは、ちょうどまだ実行されているdoSomething場合は、次の区間をスキップします。したがって、100msを使用している場合、doSomethingの実行に110msかかると、次の実行は90ms後に行われます(もちろん、これらの時間はすべて概算です)。

もう1つの違いは、setTimeoutでは毎回新しいハンドルを取得しますが、setIntervalでは1つのハンドルが得られます。与えられたとして、あなたの例で

もう1つの違いはsetIntervalであなたは一度だけパーサ/コンパイラを発射しているのに対し、setTimeout例では、あなたは、JavaScriptのパーサ/コンパイラたびを発射していることです。しかし、この相違は重要ではありません。なぜなら、あなたはそれを全くしてはならないからです。  —以下を参照してください。

しかし、微妙な違いはさておき、あなたが持っているもの、機能的に同じあります。


サイドノート:それはsetTimeoutsetIntervalいずれかに文字列を渡すのがベストプラクティスではありません。代わりに、関数の参照渡し:文字列を渡す

// setTimeout 
function myFunction(){ 
    setTimeout(myFunction, 100); 
    doSomething(); 
} 
setTimeout(myFunction, 100); 

// setInterval 
function myFunction(){ 
    doSomething(); 
} 
setInterval(myFunction, 100); 

は、JavaScriptのパーサを発射し、evalと同じことを行います。可能な限り避けるべきです(ほとんど常に可能です)。

+1

後に実行が答えをいただき、ありがとうございます。もちろん、関数参照を使う方が良いです。しかし、これは私にアイデアを与えました。文字列で 'setTimeout'を実行すると、' setTimeout( 'myFunction(' + i + ');'、100); 'のように関数に変数を渡すことができます。この変数は 'myFunction'が(ローカルに)呼び出されるたびに評価されます。グローバル変数( 'myFunction'に渡されない)を除いて、' setInterval'でも同じことをする方法はありません。だから別の違いがあります。 – freakish

+0

@freakish:真。私はそのようにはしませんが、文字列を使用すると、それは別の違いです。 –

+0

+1よく書かれた&詳細な答え、良いTJのために行っていないうれしいよ:) – alex

1

T.J。クラウダーが主な違いを説明し、一つの他のより微妙な(これは説明するのは簡単だと私は時間スケールを変更する)表示される可能性:1日:

は、プロットに非常に大きなタイムアウト時間との差ができます。 1日目の00:00に両方のメソッドを呼び出して、1年間実行させます。

1年後、setIntervalによって呼び出されるメソッドは00:00 +数ミリ秒で実行されます1つは、この正確な瞬間にプロセッサが何かを行うことを要求し、OSタイマは粒度を持っています)。

しかし、毎日、それは少し時間が要求された後に呼び出されると同時に、次の日と呼ばれるように要求されていたので、あなたのsetTimeoutメソッドは、多分午前0時01分の周りに、後者が発生します...

PS:それはまた、いくつかのケースでは、要求された時間の前に呼び出される可能性が、より多くの場合より、それは:-D