Javascript 在jQuery键关闭后访问属性
我有一个叫做player的对象Javascript 在jQuery键关闭后访问属性,javascript,jquery,Javascript,Jquery,我有一个叫做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(
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属性?我该如何处理它呢?因为您的keydown处理程序中的
this
就是元素本身(在本例中,document.body
)。你要么
var self = this;
$(document.body).keydown(function() { self.handleKeyDown() });
或者考虑使用或,因为此表示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);
}
编辑:嗯,我读得很快,我是说把手按下。无论如何,
this
的上下文会发生变化,因此最好将其存储在self
字段中,以澄清您的代码,并确保您引用的是您的想法。因为this
的工作方式与您在javascript中所认为的不同<代码>此是执行当前函数的上下文。所以当你做一些像object.doThing()
,然后在执行doThing()
时,这是指向对象的。但是,您可以在不使用对象引用的情况下调用doThing(),然后这是全局对象
下面是您为使用闭包概念而重写的代码,以避免出现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中的一种令人大开眼界的方法,表明此
的运行方式与您最初认为的不一样。如果使用ES5,您可以使用(或在较旧的浏览器上,对其进行填充,或使用$.proxy
)来确保正确设置此
:
this.handleKeyDown = function(event) {
console.log(this.x);
}.bind(this);
或者,您可以在词法范围内维护对该
的外部引用:
var self = this;
this.handleKeyDown = function(event) {
console.log(self.x);
};
这里的
this
是“document.body”,而不是对象播放器
。在这种情况下,您使用this
。您说过“此代码可以进一步重构以使用原型”,指的是具有词汇范围变量的代码。你的建议自相矛盾。在那种情况下,它在哪里暗示它会保持原样?