我看到有关使用this
的链接是jQuery。是的,问题恰恰是这个问题,但这种情况完全不同,所以请删除无用的链接到其他问题并标记为重复,因为这可能会导致混淆SO用户寻找更简单的情况。
另外:我的代码完全粘贴在这里,而不仅仅是一个片段,我的代码根本没有使用一些复杂的绑定,更基础。所以对我来说这是一个全新的问题
这是我的完整工作代码
var game = {
status : {
NOT_INITIALIZED : "gamepad:not_initialized",
INITIALIZED : "gamepad:initialized",
},
_selector : null,
_status : null,
init : function( gamepad_selector ) {
this._selector = gamepad_selector;
$(this._selector).on(this.status.NOT_INITIALIZED, this.onNotInitialized);
this.setState(this.status.NOT_INITIALIZED); // just to force the first console log
$(this._selector).on(this.status.INITIALIZED, this.onInitialized);
this.setState(this.status.INITIALIZED);
},
setState : function ( new_status ) {
this._status = new_status;
$(this._selector).trigger(new_status);
},
onNotInitialized: function () {
console.log("onNotInitialized()");
},
onInitialized: function () {
console.log("onInitialized()");
},
}
入口点是对game.init()
的调用。
请注意,在init
函数上,我可以使用其中一个预定义状态调用setState
。这很有效。
this.setState(this.status.NOT_INITIALIZED);
我试图避免使用this.setState
,因此我删除了此函数并尝试将this._state
直接设置为事件侦听器。
这是无效代码的重要部分:
init : function( gamepad_selector ) {
....
console.log ("a");
$(this._selector).on(this.status.NOT_INITIALIZED, this.onNotInitialized);
console.log ("b");
$(this._selector).trigger(this.status.NOT_INITIALIZED)
console.log ("c");
....
},
onNotInitialized: function () {
// I can't do this: throws an error
this._status = this.status.NOT_INITIALIZED;
console.log("onNotInitialized()");
},
问题:在运行时我遇到了这个错误:
Cannot read property 'NOT_INITIALIZED' of undefined
与
有关this._status = this.status.NOT_INITIALIZED;
错误是在运行时,而不是在'编译'时(请原谅我这个术语),因为我可以在控制台日志中看到a
和b
。但不是c
。
为什么我可以在this.status.NOT_INITIALIZED
中明确使用init
,但不能在onNotInitialized
中明确使用?
答案 0 :(得分:2)
问题与JavaScript绑定this
变量的方式有关 - 完整规则为quite complex,但代码失败的原因是当您通过{0}}方法调用onNotInitialized
方法时jQuery on()
方法this
未绑定到您的game
对象,而是绑定到触发事件的元素。
您可以使用bind()功能修复此问题,如下所示:
$(this._selector).on(this.status.NOT_INITIALIZED, this.onNotInitialized.bind(this));