2016-05-16 11 views
0

JavaScriptの構文に慣れています。私はkeypressesにアクションをバインドしようとしていますが、ここで私は見つけられないいくつかの切断があります。 switchケースが問題なく呼び出されるのはなぜですか?しかし、呼び出される関数は決して実行されません。javascript関数の呼び出しが機能しない

this.init = function() { 
    $(document).keydown(this.handleKeyPress); 
} 

this.handleKeyPress = function(event) { 
    switch (event.which) { 
     case 37: 
      alert("key press");  //this executes 
      this.turn("left"); 
      break; 
     case 38: 
      this.turn("up"); 
      break; 
     case 39: 
      this.turn("right"); 
      break; 
     case 40: 
      this.turn("down"); 
      break; 
    } 
} 

this.turn = function(direction) { 
    alert(direction);     //this does not 
} 

私はこれが唯一の関連コードだと思いますが、参考になった場合はさらに投稿してください。ご協力いただきありがとうございます。

+2

被災者ではなくイベントですか?あなたの範囲は何ですか?これはブロック内に包まれていますか? –

+1

'handleKeyPress'関数のコンテキストがjQueryによってオーバーライドされています。これを防ぐには、あなた自身が明示的にコンテキストをバインドすることができます:switch文の 'console.log(this)'なら、 '$(document).keydown(this.handleKeyPress.bind(this))' – Hamms

+0

'これはあなたが期待する文脈の中にありません。なぜあなたは 'これ 'を使っているのですか?これは別のオブジェクトの中にありますか?定義を 'var turn = function(direction){...}'に更新しない場合は、 'turn( 'left')'を使用してください。 – scrappedcola

答えて

2

ほとんどの場合、「this」の意味に問題があります。あなたは匿名関数の中にいるとき、これは匿名関数ではなく、それが中にネストされています外側の関数を指しますが、おそらくこのような何かをしたい:。

this`はを参照しているかもしれない `ので
var myObj = this ; 
myObj.init = function() { 
    $(document).keydown(myObj.handleKeyPress); 
} 

myObj.handleKeyPress = function(event) { 
    switch (event.which) { 
     case 37: 
      alert("key press");  //this executes 
      myObj.turn("left"); 
      break; 
     case 38: 
      myObj.turn("up"); 
      break; 
     case 39: 
      myObj.turn("right"); 
      break; 
     case 40: 
      myObj.turn("down"); 
      break; 
    } 
} 

myObj.turn = function(direction) { 
    alert(direction);     //this does not 
} 
関連する問題