2016-05-16 2 views
0

Я все еще привык к синтаксису javascript. Я пытаюсь связать действия с нажатиями клавиш, и есть некоторая связь здесь, которую я не вижу. Почему случай 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

Может быть, потому что 'this' является ссылкой на событие, а не вызываемый? Какова ваша сфера? Это обернуто внутри блока? –

+1

контекст вашей функции 'handleKeyPress' переопределяется jQuery. Чтобы этого избежать, вы можете явно привязать контекст самостоятельно: '$ (document) .keydown (this.handleKeyPress.bind (this))' – Hamms

+0

, если вы 'console.log (this)' внутри оператора switch. 'this' не в том контексте, который вы ожидаете. Почему вы используете 'this'? Это внутри другого объекта? Если вы не обновляете свое определение до 'var turn = function (direction) {...}' и внутри case используйте 'turn ('left')'. – scrappedcola

ответ

2

Скорее всего, вы сталкиваетесь с проблемами с тем, что означает «это». Когда вы находитесь внутри вашей анонимной функции это относится к анонимной функции, а не внешняя функция, что он вложен в Вы, вероятно, хотите сделать что-то вроде этого:.

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 
} 
Смежные вопросы