2016-05-31 18 views
0

我很確定這是一個普通的JS問題,而不僅限於Backbone,但是我在學習Backbone時遇到了這個問題。在下面的第一個例子中,我沒有遇到錯誤,但第二個例子不同。你能解釋幕後發生了什麼事情,使Chrome Dev Tools在後一個例子中顯示錯誤,但不是第一個。我最好的猜想是,當某個函數在某個函數中(如初始化)時,它不會立即運行,因爲瀏覽器正在讀取腳本,而如果它是被定義的類的一部分(在本例中爲app.ItemView) ,需要完成對象上下文,以便瀏覽器需要讀取this.model#get以便構建上下文對象。爲什麼將Backbone和Handlebar的上下文放入初始化函數中刪除錯誤?

app.ItemView = Backbone.View.extend({ 
    initialize: function() { 
     this.context = { 
      title: this.model.get("title"), 
      completed: this.model.get("completed") 
     } 
    } 
}); 

app.ItemView = Backbone.View.extend({ 
    context: { 
     title: this.model.get("title"), 
     completed: this.model.get("completed") 
    } 
}); 

遺漏的類型錯誤:無法讀取未定義

編輯的特性 'GET':它也不會工作,如果在第一個例子ISN上下文沒有正確定義 -

app.ItemView = Backbone.View.extend({ 
    initialize: function() { 
     this.context.title = this.model.get("title"); 
     this.context.completed = this.model.get("completed"); 
     this.render(); 
    } 
}); 

遺漏的類型錯誤:閱讀mu is too short的評論後無法讀取的不確定

回答

1

編輯修正的this解釋財產「GET」。

錯誤的主要原因是您的第二段代碼中的this可能是指window或調用了Backbone.View.extend的函數的調用者。

該對象沒有model屬性,因此它的undefinedundefined上調用get導致該錯誤。

您需要製作initialize函數,因爲它大概會由Backbone.View對象調用,該對象具有可用的model屬性。在這種情況下,this將引用Backbone.View對象。

+2

在第二個例子中'this''是'extend'調用之外的任何東西(可能是瀏覽器中的'window''),它不會是'{context:{...}}'對象,它是被傳遞給'extend'。 –

+0

這是一個愚蠢的問題,但即使還沒有定義一些東西,就像在第一個例子中一樣,javascript會好嗎?所以如果「this」指的是窗口,那麼它將不起作用,但在初始化方法中,是不是「this」指向尚未創建的實例對象?爲什麼沒有JavaScript拋出一個錯誤呢? – akantoword

+0

我認爲,因爲函數可以在不同的對象下執行(例如,通過使用'bind'或通過將函數賦值給另一個對象的屬性),直到函數中的'this'的任何實例運行。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#As_an_object_method –

相關問題