我正在尝试在Javascript中使用方法调用模式。我声明一个函数作为对象成员。方法调用模式中的Javascript“this”指针不指向对象
根据Javascript:好部件,这应该导致this
指针引用封闭对象。当我以前尝试过这种情况时,情况就是如此。
在下面的代码的示例,由单个console.log
语句this
指针引用指向的功能,不是对象。我仔细检查了我的代码,我真的不知道发生了什么。
我可以使用另一双眼睛在这个。有没有真正明显的我在这里失踪,还是我期待错误的行为?谢谢。
编辑:我在我的代码中发布了一个错误,我发布了(它一直在流量);匿名函数中的关键字应该是that
,而不是this
。固定。
DOUBLE EDIT:我在模块中添加了其余的代码。我试图编写一个commonJS模块(根据我使用的gameJS库),虽然我不确定这会是什么问题,但我想知道是否是。这会改变什么吗?从Chrome的开发者控制台
var gamejs = require('gamejs');
var system = require('app/system');
var input = {
eval_keys: function() {
console.log(this); // This should be the outer object, but shows the function!
var that = this;
gamejs.event.get().forEach(function (event) {
if (event.type === gamejs.event.KEY_DOWN) {
for (var key in that.keyconfig) {
if (that.keyconfig.hasOwnProperty(key)) {
if (event.key === gamejs.event[key]) {
that.keyconfig.key = true;
}
}
}
system.log("KEYDOWN", event.key);
}
if (event.type === gamejs.event.KEY_UP) {
for (var key in that.keyconfig) {
if (that.keyconfig.hasOwnProperty(key)) {
if (event.key === gamejs.event[key]) {
that.keyconfig.key = false;
}
}
}
system.log("KEYUP", event.key);
}
return keyconfig;
});
},
eval_mouse: function() {
/* in progress
else if (event.type === gamejs.event.MOUSE_MOTION) {
// if mouse is over display surface
if (display.rect.collidePoint(event.pos)) {
system.log("mousemove", testcoords);
testcoords = event.pos;
}
}
*/
},
keyconfig: {
K_UP: false,
K_LEFT: false,
K_RIGHT: false,
K_DOWN: false
}
};
exports.eval_keys = input.eval_keys;
输出:
Object {eval_keys: function}
eval_keys: function() {
arguments: null
caller: null
length: 0
name: ""
prototype: Object
__proto__: function Empty() {}
<function scope>
__proto__: Object
我没有看到你的代码的入口点....什么是被调用和在哪里? – jondavidjohn 2013-03-24 18:05:17
正如我预料的那样工作 - > [** FIDDLE **](http://jsfiddle.net/YQPF2/),并且您发布的控制台输出告诉我,它的工作方式与您的预期一样,并且'this'实际上是将其登录到控制台的外部对象。在其他函数的范围内,'this'当然会引用范围等。 – adeneo 2013-03-24 18:07:17
@jondavidjohn我从我的主脚本中调用函数。我将它作为commonJS模块导入。 (我更新了我的帖子以反映这一点,以防某些问题导致某些问题。)但是,我期望在创建对象时,'this'指针应该显示我所有的方法... – 2013-03-24 18:20:46