2012-08-24 73 views
2

我很難理解Backbone.js中的Todo.js教程中提到的「this」是什麼。具體而言,在裏面APPVIEW:Todo.js中提到的關鍵字是什麼? (骨幹教程)

initialize: function() { 
this.input = this.$("#new-todo"); 
this.allCheckbox = this.$("#toggle-all")[0]; 

Todos.bind('add', this.addOne, this); 
Todos.bind('reset', this.addAll, this); 
Todos.bind('all', this.render, this); 

this.footer = this.$('footer'); 
this.main = $('#main'); 
}, 

所以當Todos.bind( '添加',this.addOne,這一點)被調用時,它被認爲(this.addOne)綁定到集合( '添加' )。如果是這樣,我們假設第三個參數(「this」)也引用了AppView對象。爲什麼我們需要將「this」作爲第三個參數?

註釋源代碼:http://backbonejs.org/docs/todos.html

回答

3

this作爲第三個參數是this上下文被調用在第二參數的函數時設置。

這聽起來很混亂,所以讓我試試並分解它。讓我們來看看這條線......

Todos.bind('add', this.addOne, this); 

如果我們使用這個,而不是...

Todos.bind('add', function() { this.$el.text("Hello, world!"); }); 

...我們就不需要第三個參數的。在這種情況下,函數立即被調用並且其this被保留。

但是,因爲我們不希望每一個內聯函數,我們通過參考函數是這樣的...

Todos.bind('add', this.addOne, this); 

這是相同的例子。當你調用像this.addOne()這樣的函數時,其this被設置爲this它被調用。

但是,當你傳遞一個引用(不要立即調用它)時,它的this上下文丟失,當調用時,它將是window,這不是你想要的。

爲了防止出現這種情況,第三個參數是調用該函數時要使用的this上下文。

在內部,Backbone將使用_.bind()來綁定它。這是一個用於原生bind()方法的函數的polyfill。

+0

謝謝你的澄清。非常感激。還有一個問題,如果我可能:在源代碼中,對於AppView中的addOne函數,參數「todo」是指什麼? – Sean

+1

@SeanDokko它是對一個實例化的TodoList集合的引用。 – alex

+0

但是不會有衝突,因爲TodoList不是一個模型,而是一個集合?這不是更有意義嗎: 模型:新模型而不是模型:待辦事項? – Sean