我有一个名为player
的对象function Player(_x, _y, _speed) {
this.x = _x;
this.getX = function() {
return this.x;
};
this.handleKeyDown = function(event) {
console.log(this.x); // undefined
};
$(document.body).keydown(this.handleKeyDown);
}
为什么“handleKeyDown”没有看到我的x属性?我该如何解决它?
答案 0 :(得分:0)
因为你的keydown处理程序中的this
是元素本身(在这种情况下,document.body
)。你需要
var self = this;
$(document.body).keydown(function() { self.handleKeyDown() });
答案 1 :(得分:0)
因为this
不能像您认为的那样在javascript中运行。 this
是正在执行当前函数的上下文。所以,当你执行类似...... object.doThing()
之类的操作时,那么在执行doThing()
时,这指向了对象。但是,您可以在没有对象引用的情况下调用doThing(),然后this
是全局对象。
下面是您重写的代码,使用闭包的概念来避免this
schenanigans。这段代码可以进一步重构以使用原型并避免额外的内存开销,一次又一次地创建所有相同的函数,但我不想用更多的信息来破坏它。
function Player(_x, _y, _speed) {
var x = _x;
var getX = function() {
return x;
};
var handleKeyDown = function(event) {
console.log(x);
};
$(document.body).keydown(handleKeyDown);
}
Javascript中的一个令人大开眼界的方法,表明this
无法按照您最初的想法运作MDN docs for Function.prototype.apply。
答案 2 :(得分:0)
如果使用ES5,您可以使用.bind
(或在旧版浏览器上,使用$.proxy
),以确保this
设置正确:
this.handleKeyDown = function(event) {
console.log(this.x);
}.bind(this);
或者您可以在词法范围内维护this
的外部引用:
var self = this;
this.handleKeyDown = function(event) {
console.log(self.x);
};
答案 3 :(得分:0)
this
在这里是'document.body',而不是对象Player
答案 4 :(得分:-1)
因为this
表示getX函数,请尝试以下操作:
function Player(_x, _y, _speed) {
var self = this;
self.x = _x;
self.getX = function() {
return self.x;
};
self.handleKeyDown = function(event) {
console.log(self.x);
};
$(document.body).keydown(self.handleKeyDown);
}
编辑:嗯,我读得很快,我的意思是handleKeyDown。无论如何,事情是this
的上下文发生了变化,因此将它存储在self
字段中以澄清您的代码并确保您引用您的想法是一种很好的做法。