2012-03-15 21 views
1
setInterval(this.Animate(), this.speed); 

これは毎回実行されると予想されます。はい、ブラウザは1回だけ実行します。その理由は何でしょうか?Javascript setIntervalは1回だけ実行されます

+0

どうやって 'this'を定義したか –

+0

同じクラスへのポインタ... –

答えて

6

Animateが由来の機能である場合プロトタイプ、あなたが使用する必要があります:

setInterval(this.Animate.bind(this), this.speed); 
+1

+1現在の' this'を呼び出しコンテキストとして保持する必要がある可能性があります。 –

5

次の操作を行います。

setInterval(this.Animate, this.speed); 

あなたが機能を実行する代わりに、一定の間隔で実行される関数への参照を代入している...

3

は私たちがあなたのコードを見てみましょう

setInterval(this.Animate(), this.speed); 

すぐに関数this.Animate()を実行し、返されたものが呼び出されるようにします。あなたが何をしたいか

thatは現在のスコープを維持

var that = this; 
setInterval(function(){ that.Animate() }, this.speed); 

クロージャを作成することです。

5

あなたは括弧を置くとき、それは常にあなたがここに欲しいものである、代わりにそれを渡す関数を呼び出し、括弧なしであなたの関数を実行するために試してみてください。あなたは、

setInterval(this.Animate, this.speed); 

それはまだ動作しない場合'this'が変更される可能性があるため、デバッグして 'this'のスコープを調べる必要があります。あなたは、ブラウザのJSデバッガにブレークポイントを追加することでそれを行うことができます。 また、あなたは

var animate = this.animate.apply(this) 
setInterval(animate, this.speed); 

を「適用」p.sとスコープの問題を回避するために、これを試すことができます:彼らがキューに入れ、その後、一度に発射する可能性があるとして、アニメーションのためのsetIntervalを避けるために良い選択かもしれません。代わりに、ループを作成するために、関数の最後(this.Animate)でsetTimedoutを何度も呼び出します。

1

あなたはjQueryのを探している場合は、スクリプトを更新してみてください。

refreshId = setInterval(function() { 
    // Events or Actions 
}, 5000); 

をあなたはこれを一時停止または停止する場合は、明確な間隔を使用しますclearInterval(refreshId);を。

関連する問題