2016-07-19 11 views
0

匿名関数の式に使用したsetTimeout:Javascriptが:私は最近、いくつかのものを維持するためにはJavaScriptを学び始め、この問題に今日走った

初期化が呼び出されると、私はmoveCharが呼ばれることを期待
this.moveChar = function(){ 
    // body here 
    setTimeout(moveChar,1000); 
} 

this.initialise= function(){ 
    this.moveChar(); 
} 

、繰り返さ1000msごとに1回呼び出す

しかし実際にはmoveCharは一度呼び出されるとそれだけです。私が読んだ他のスタックオーバーフローの投稿に基づいて、私はそれが宣言されているのではなく表現されている関数と関係していると考えました。私は使用しようとしました

this.moveChar = function recMove(){ 
    // body here 
    setTimeout(recMove,1000); 
} 

運もありません。

どのように私はこれを修正することができますか?

編集:私がする必要があることは、毎秒1回呼び出されるmoveChar関数を持たせることです。 setTimeout再帰よりも優れたアプローチがある場合は、私はそれを開いています

+0

サイド 'body here'に' this'を使用していますか?その場合は、コール中に正しいコンテキストをバインドする必要があります。 –

+2

最初に特定の遅延のたびに関数を実行したい場合は、 'setInterval'を使います。次に、 'setTimeout(moveChar、1000);'を実行すると、JSは 'moveChar'という名前の変数を探して何も見つけられません。 'moveChar'はオブジェクトの一部で、' this.moveChar'では 'object.moveChar'としてアクセスする必要があります。今度は再帰的にループしているので、 'this'をもう一度バインドする必要があります。あなたのコードは 'setTimeout(this.moveChar.bind(this)、1000)' – Rajesh

+0

になります。関数moveCharはthis.VARIABLENAMEを使っていくつかのグローバル変数を使用してそれらを参照します。コンテキスト部分へのバインディングについて詳しく説明できますか? – kcns15

答えて

3

this.moveCharthiswindowようなグローバルスコープのオブジェクトである場合を除き、moveCharと同じではありません。

this.moveCharはオブジェクトのプロパティですが、moveCharは可視スコープチェーン内の任意の変数を参照します。あなたはどのようなオブジェクトの範囲を維持するために、物事のカップルにそれを変更することができます

が使用されています:

.bind()

this.moveChar = function(){ 
    // body here 
    setTimeout(this.moveChar.bind(this),1000); 
} 
を使用して arrow function

this.moveChar = function(){ 
    // body here 
    setTimeout(()=>this.moveChar(),1000); 
} 

を使用して

1

ここでside bodythisを使用していますか?
もしそうなら、コール中に正しいコンテキストをバインドする必要があります。

this.moveChar = function(){ 
    // body here 
    setTimeout(this.moveChar.bind(this), 1000); 
} 

または匿名関数を使用します。

this.moveChar = function(){ 
    // body here 
    var that = this; 
    setTimeout(function(){ 
     that.moveChar(); 
    }, 1000); 
} 

または矢印機能:

this.moveChar = function(){ 
    // body here 
    setTimeout(() => this.moveChar(), 1000); 
} 

同じノートはsetIntervalバリアントに適用されます。

this.initialise= function(){ 
    setInterval(this.moveChar.bind(this), 1000); 
    // var that = this; 
    // setInterval(function(){that.moveChar();}, 1000); 

    // setInterval(() => this.moveChar(), 1000); 
} 
+0

彼は実行を繰り返す必要があります。ここでは 'setInterval'が必要です。 –

+0

この 'setTimeout'は実行を繰り返します。ここで 'setInterval'が必要なのはなぜですか? –

+0

この[W3Schoolsドキュメント](http://www.w3schools.com/jsref/met_win_settimeout.asp)の2番目の**ヒント**を確認してください –

1

あなたが使用して検討する必要がありますこのタスクのより適切なAPIである

setInterval()は何ですか - 特定の間隔に達すると、指定された関数を繰り返し呼び出します。

参照: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval

引用:

を繰り返し、各呼び出しの間に一定 時間遅延で、関数を呼び出すか、コードスニペットを実行します。 intervalIDを返します。

例:

moveChar()があなたの操作ロジックが含まれていますと仮定。それを繰り返すには、この1行を行います。

let moveChar = function(){ 
    // Do stuff 
    console.log("Hi thanks for calling me!"); 
} 

setInterval(moveChar, 1000); 
+0

私はこれを試して、何らかの理由でmoveChar関数の1回の反復を実行しませんでした – kcns15

+0

@ kcns15は仕事中のマシンで動作します。上のコードを貼り付けてテストしてみてください。それともマイナーな改造をしましたか?あなたが現在のコードを見せてくれたら?さらに援助して幸いです。 –

-2
this.moveChar = function(){ 
     // body here 
    alert('called moveChar'); 
    } 

this.initialise= function(){ 
    setInterval(function(){moveChar();},1000); 
} 

this.initialise();//call here 
+1

まず、コードを入力するだけでよい答えはありません。あなたはあなたが何を変えたのかを説明するべきです。次に、コードを実行してからここに配置します。 – Rajesh

関連する問題