2012-10-30 16 views
3

我剛剛進入Backbone,有一件事我不明白爲什麼模型的on()方法總是需要三個參數 - 事件,處理程序和上下文。爲什麼Backbone.js模型的'on()'將'this'作爲最後一個參數,如果它幾乎總是這樣呢?

似乎幾乎總是'this'用於上下文,我還沒有看到任何其他用法。即使有,因爲我還沒有看到它,但它一定是非常罕見的。

所以我的問題是:什麼時候使用「this」以外的上下文,爲什麼Backbone是這樣設計的?順便說一句,我明白爲什麼你需要提供上下文,這只是我想知道爲什麼方法語法指定我使用三個參數而不是使最後一個參數可選 - 這似乎總是「這個」,並感覺多餘。我確定我錯過了一些東西。請有人幫助我理解。謝謝!

  • [編輯]爲什麼不能在一個這樣做:

    model.on = function(event, callback){ 
        model.on_with_three_args.call(this, event, callback, this); 
    }); 
    
    model.on_with_three_args = function(event, callback){ 
        /* whatever the on() is supposed to do */ 
    }); 
    

回答

9

假設我們在這是基於模型的觀點,我們要綁定到模型的變化事件:

this.model.on('change', this.render); 

on調用看到兩件事情:

  1. 事件名稱,一個簡單的字符串。
  2. 處理程序,一個函數。

on有沒有知道什麼this意味着this.render的方式,它只是看到一個功能; on甚至不知道上面的通話之間的差異,這樣的:

this.model.on('change', function() { ... }); 

如果你的函數需要一個特定的背景下,你有兩個選擇:

  1. 創建使用_.bind_.bindAll綁定功能, Function.bind,$.proxy,CoffeeScripts =>,var _this = this關閉技巧或任何創建或模擬綁定函數的方法。
  2. 說告訴它你想要的背景:

    this.model.on('change', this.render, this); 
    

有沒有辦法解開調用棧,看看你想要的this所以你必須要明確一下。

骨幹將調用回調是這樣的:

node.callback.apply(node.context || this, ...); 

其中node.callback是回調函數和node.context是第三個參數(如果有的話)給on。如果你沒有指定上下文,那麼當調用trigger時,你會得到this;在上面的例子中,this最終會成爲模型。

因此,on的第三個參數實際上是可選的,但默認值並不十分有用,並且沒有辦法選擇更好的默認值,您只需在JavaScript中無法訪問用於選擇合理上下文的信息。這就是爲什麼你在Backbone視圖中看到如此多的_.bindAll(this, ...)樣板。


如果你試過這樣的事情:

model.on = function(event, callback){ 
    model.on_with_three_args.call(this, event, callback, this); 
}); 

然後this在這種情況下,通常會model所以你真的會說:

model.on = function(event, callback){ 
    model.on_with_three_args.call(model, event, callback, model); 
}); 

model.on = function(event, callback){ 
    model.on_with_three_args(event, callback, model); 
}); 

,並且對此沒有任何意義。在on之內的this的值與代碼中的this的值幾乎沒有任何關係,該代碼調用on。 JavaScript中的this不是一個變量,它是一個引用當前調用上下文的關鍵字。

+0

感謝您的回答!我不知道它是可選的。讓我確定我理解正確。根據你的代碼node.callback.apply(node.context || this,...);這是不是意味着默認的上下文確實是'this'?我不明白你爲什麼說這不是非常有用。 – Vlad

+0

另外,爲了澄清,如果我們使用第三個參數'this',_.bindAll(this,...)不是真的需要,這是正確的嗎?爲什麼這麼多人在代碼中使用_.bindAll? – Vlad

+0

@Vlad:'this'的值總是取決於上下文。調用'this.model.on(...)'時的'this'與調用'trigger'時的'this'不同。 'this'不是一個變量,它看起來像一個。 –

相關問題