JavaScript addEventListener添加对当前对象的引用
JavaScript addEventListener add a reference to the current object
我简化了代码来说明这个问题。
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对象的引用。在键盘输入功能中,这指的是窗口。我理解为什么它指的是窗口,但我想不出解决方案。。。
完整的代码可以在这里看到:http://eriknijland.nl/stackoverflow/snake_event_listener/
虽然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?)
如果目标是ES5(你应该是),你应该写:
window.addEventListener('keydown', this.keyboardInput.bind(this), false);
这将确保总是以CCD_ 1作为其上下文来调用回调。
试试这个:
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
}
}
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- 返回 JavaScript 类值而不是对象引用
- Facebook:当发布期望对象引用时显示打开的图形对话框
- Javascript-如何从字符串/对象引用回调
- 将其用于对象引用
- 如何将对象引用传递到 mootools 中另一个对象的构造函数中
- Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么
- 在 Jquery 中,我可以存储对象引用并在以后使用它吗?
- 将对象函数传递给请求动画帧时丢失对象引用
- JavaScript ecma6中的对象引用
- 在JSON中存储对象引用
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 对象引用的隐式传递是如何工作的
- 按对象的 ID 删除对选定对象的对象引用
- 在调用的函数中使用对象引用(this)
- 如何在testcomplete+js中获取对象引用
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- JavaScript对象引用
- 对象引用未设置为行中的对象的实例,如果 (!string.IsNullOrEmpty(tdcd.文本)&&
- 如何在使用声明式 Dojo 时获取对象引用