2013-08-21 27 views
10

最近、HTML5ゲームを作成する目的でJavaScriptを学習し始めました。 。このJavaScript関数を一方向に呼び出すことはできますが、もう一方向に呼び出すことはできません。

例として、新しいスプライトをゲームの更新(アニメーション、移動など)が行われるたびに実行する必要があるアクションの配列で初期化するコンストラクタがあります。 This JSFiddleは、基本的な実装を示しています。

は基本的に、私は...これが動作しない理由として

Sprite = function() { 

    this.actions = [this.animate]; 
}; 

Sprite.prototype = { 

    animate: function() { /* animate the sprite */ }, 

    update: function() { 

     this.actions[0](); // doesn't do anything (?) 
    } 
}; 

困惑している...しかし、これは私の経験の浅い目に

Sprite = function() { 

    this.actions = [this.animate]; 
    this.holder = 'whatever'; 
}; 

Sprite.prototype = { 

    animate: function() { /* animate the sprite */ }, 

    update: function() { 

     this.holder = this.actions[0]; 
     this.holder(); // executes animate function as desired 
    } 
}; 

を行い、両方の例は、のように見えます彼らはまったく同じことをするべきです。だから私はthis.actions[0]()を直接呼び出すと何も起こりませんが、this.actions[0]this.holderに割り当ててからthis.holder()に電話をかけても問題ありません。

+0

変更[0]。削除()。 – Saturnix

答えて

4

関数が呼び出されると、関数内のローカル変数thisに値が割り当てられます。あなたはそれを変更するために何かを行っている場合を除き

(例えばnewは、bind()call()apply())は、値は、それが呼び出されているオブジェクトになります。 barの機能の中にfoo.bar()this === fooで機能します。

this.actions[0]()actionsプロパティ

this.holder()の値に等しいthisthisの値は、呼び出し元の関数にあるものと同じthisになります。

あなたの機能は、それが何をするにしてもthisという値に依存している必要があります。この問題を解決するために

+0

最初のコードは 'this.actions [0] .apply(this);' – jcubic

+0

でなければなりません。this.holder()がthisを "this"の値と同じにする方法をもっと詳しく教えてください呼び出し関数 '?私は 'this.holder = this.actions [0]'のときにどうして特別な違いがあるのか​​理解できません。 –

+1

'foo.bar.baz()' - 'baz'の中で' this'は 'baz()'が呼び出されたオブジェクトなので 'bar'の値と同じです。 'this.holder()'は 'this'で' holder'を呼び出します。 'this.actions [0]()'は 'actions'に対して' 0() 'を呼び出します。 – Quentin

3

二つの方法:

Sprite = function() { 
    this.actions = [this.animate.bind(this)]; 
}; 

または:this.actionsへ

update: function() { 
    this.actions[0].call(this); 
} 
+0

私は解決策以上の説明を求めていたので、私はクエンティンの答えを受け入れましたが、手元にあるタスクを達成するために用意したオプションは非常に便利です(私の目的は2番目のものを使用する可能性が高いです)。 – user2703034

+0

@ user2703034:そうですね、これはあなたの元の質問に答えることはできませんが、役に立つと思っていました。 – Eric

関連する問題