Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jQuery键关闭后访问属性_Javascript_Jquery - Fatal编程技术网

Javascript 在jQuery键关闭后访问属性

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(

我有一个叫做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属性?我该如何处理它呢?

因为您的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
。您说过“此代码可以进一步重构以使用原型”,指的是具有词汇范围变量的代码。你的建议自相矛盾。在那种情况下,它在哪里暗示它会保持原样?