0

我已经简化了我的代码来说明问题。

function SnakeGame ()
{
    this.snakeDirection         = 'right';

    this.Init = function ()
    {
        window.addEventListener('keydown', this.keyboardInput, false);
    }

    this.keyboardInput = function (event, SnakeGameObject)
    {
        console.log(SnakeGameObject); //Error since I can't pass this variable...
        console.log(event.keyCode); //Works
    }
}

在 this.keyboardInput 函数中,我尝试更改变量 this.snakeDirection; 问题是我无法获得对 SnakeGame 对象的引用。在keyboardInput 函数中,this 指的是window。我明白为什么它指的是窗口,但我想不出一个解决方案......

完整的代码可以在这里看到:http: //eriknijland.nl/stackoverflow/snake_event_listener/

4

3 回答 3

2

虽然 Mythril 的回答是正确的,但我建议您不要将方法用作事件回调。因为:a)它们是公开的,所以一旦你的代码变大就可以很容易地被否决,并且 b)它们可以公开访问:

var snakeInstance = new SnakeGame();
var otherObject = new SomethingElse();
snakeInstance.keyboardInput.apply(otherObject,[]);//invokes method, uses self, though self !== otherObject, but snakeInstance.

所以我会使用一个闭包:

function SnakeGame()
{
    this.snakeDirection = 'right';
    var keyBoardInput = (function(that)
    {
        return function(e)
        {
            console.log(that);
            console.log(e.keyCode);
        }
    })(this);
    this.Init = function()
    {
        document.body.addEventListener('keydown',keyboardInput,false);
    }
}

另请记住,您的代码与 X 浏览器不完全兼容(addEventListener && attachEvent?)

于 2012-09-01T21:47:02.980 回答
1

如果目标是 ES5(你应该是),你应该写:

window.addEventListener('keydown', this.keyboardInput.bind(this), false);

这将确保回调始终this作为其上下文调用。

于 2012-09-01T21:52:15.940 回答
0

试试这个:

function SnakeGame ()
{
    var self = this;
    this.snakeDirection         = 'right';

    this.Init = function ()
    {
        window.addEventListener('keydown', this.keyboardInput, false);
    }

    this.keyboardInput = function (event)
    {
        console.log(self); 
        console.log(event.keyCode); //Works
    }
}
于 2012-09-01T21:33:07.507 回答