运行时抛出未定义的错误

时间:2015-08-13 08:28:56

标签: javascript jquery

我看到有关使用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;

错误是在运行时,而不是在'编译'时(请原谅我这个术语),因为我可以在控制台日志中看到ab。但不是c

为什么我可以在this.status.NOT_INITIALIZED中明确使用init,但不能在onNotInitialized中明确使用?

1 个答案:

答案 0 :(得分:2)

问题与JavaScript绑定this变量的方式有关 - 完整规则为quite complex,但代码失败的原因是当您通过{0}}方法调用onNotInitialized方法时jQuery on()方法this未绑定到您的game对象,而是绑定到触发事件的元素。

您可以使用bind()功能修复此问题,如下所示:

$(this._selector).on(this.status.NOT_INITIALIZED, this.onNotInitialized.bind(this));