2015-08-13 21 views
-1

我看到關於使用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; 

呃ror在運行時,不在'編譯'時間(請原諒我),因爲我可以在控制檯日誌中看到ab。但不是c

爲什麼我可以在init中明確使用this.status.NOT_INITIALIZED而不是onNotInitialized

+1

嘗試'的console.log(這)'內部onNotInitialized功能。 – JJJ

+2

JavaScript中沒有編譯時間。 :) –

+0

@Juhana:你是對的!我忘記了事件監聽器中的'this'被引用到事件中涉及的html元素中。但是,請刪除「Mark as duplicated」,因爲這是一個關於在jQuery中使用'this'的情況的'真實世界示例',但是您指出的問題更爲寬泛。 – realtebo

回答

2

的問題是用JavaScript綁定this變量的方式做 - 完整的規則是quite complex,但你的代碼失敗的原因是,當你通過jQuery的on()方法this調用onNotInitialized方法不綁定到game對象,但觸發事件的元素。

您可以通過使用bind()功能如下解決這個問題:

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

這是一個解決方案,但我認爲這不是一個好主意。我更喜歡修改代碼來訪問'game.status。 ....'並且避免修改'this'指針 – realtebo

+0

..但是你回答並得到了問題的關鍵。 – realtebo

相關問題