假設我們在這是基於模型的觀點,我們要綁定到模型的變化事件:
this.model.on('change', this.render);
的on
調用看到兩件事情:
- 事件名稱,一個簡單的字符串。
- 處理程序,一個函數。
on
有沒有知道什麼this
意味着this.render
的方式,它只是看到一個功能; on
甚至不知道上面的通話之間的差異,這樣的:
this.model.on('change', function() { ... });
如果你的函數需要一個特定的背景下,你有兩個選擇:
- 創建使用
_.bind
,_.bindAll
綁定功能, Function.bind
,$.proxy
,CoffeeScripts =>
,var _this = this
關閉技巧或任何創建或模擬綁定函數的方法。
說告訴它你想要的背景:
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
不是一個變量,它是一個引用當前調用上下文的關鍵字。
感謝您的回答!我不知道它是可選的。讓我確定我理解正確。根據你的代碼node.callback.apply(node.context || this,...);這是不是意味着默認的上下文確實是'this'?我不明白你爲什麼說這不是非常有用。 – Vlad
另外,爲了澄清,如果我們使用第三個參數'this',_.bindAll(this,...)不是真的需要,這是正確的嗎?爲什麼這麼多人在代碼中使用_.bindAll? – Vlad
@Vlad:'this'的值總是取決於上下文。調用'this.model.on(...)'時的'this'與調用'trigger'時的'this'不同。 'this'不是一個變量,它看起來像一個。 –