2011-07-05 37 views
80

我一直在學習一些backbone.js,並且我已經看到很多使用_.bindAll()的實例。我已經通讀了整個backbone.js和underscore.js文檔頁面,試圖瞭解它的功能,但我仍然對它的功能非常模糊。這裏有下劃線的解釋:需要解釋來自Underscore.js的_.bindAll()函數

_.bindAll(object, [*methodNames]) 

綁定了許多的 對象的方法,通過指定的方法名,以 中時,他們被調用該對象 的上下文中運行。非常方便的 綁定功能,將 將用作事件處理程序,其中 否則將調用 相當無用的這一點。如果沒有提供方法名稱 ,則所有對象的 函數屬性將被綁定到 它。

var buttonView = { 
    label : 'underscore', 
    onClick : function(){ alert('clicked: ' + this.label); }, 
    onHover : function(){ console.log('hovering: ' + this.label); } 
}; 

_.bindAll(buttonView); 

jQuery('#underscore_button').bind('click', buttonView.onClick); 
=> When the button is clicked, this.label will have the correct value... 

如果您可以通過給另一個例子或許或者一些口頭解釋幫助在這裏,任何將不勝感激。我試圖尋找更多的教程或例子,但沒有出現,我滿足了需要。大多數人似乎只知道它會自動執行...

+23

很好的解釋:http://blog.bigbinary.com/2011/08/18/understanding- bind-and-bindall-in-backbone.html –

回答

64

var Cow = function(name) { 
 
    this.name = name; 
 
} 
 
Cow.prototype.moo = function() { 
 
    document.getElementById('output').innerHTML += this.name + ' moos' + '<br>'; 
 
} 
 

 
var cow1 = new Cow('alice'); 
 
var cow2 = new Cow('bob'); 
 

 
cow1.moo(); // alice moos 
 
cow2.moo(); // bob moos 
 

 
var func = cow1.moo; 
 
func(); // not what you expect since the function is called with this===window 
 
_.bindAll(cow1, 'moo'); 
 
func = cow1.moo; 
 
func(); // alice moos
<div id="output" /> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

不幸的是,實際的「綁定所有」功能只適用於功能右邊的對象。要包含在原型上定義的函數,您需要將這些函數名稱明確地作爲_.bindAll()的附加參數傳遞。

無論如何,你想要一個解釋:基本上它允許你用一個具有相同的名字和行爲,但也綁定到該對象的函數替換對象上的函數,所以即使沒有將其作爲方法調用它也是如此this === theObjecttheObject.method())。

+0

@ThiefMaster「將這些函數名稱明確地作爲_.bindAll()的附加參數傳遞。」 對不起,仍然從你的例子中學習,並試圖找出它的含義:所以你說在原型上定義的函數不會自動綁定到_.bindAll下的對象,如果要實現這一點,需要提供與對象的第一個參數;第二個參數是函數名稱IF,該函數是在原型上定義的? –

+9

[Yehuda Katz的博客文章](http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/)很好地解釋了JavaScript中的this。 –

-2

試試這個

<input type="button" value="submit" id="underscore_button"/> 

<script> 
var buttonView = { 
    id  : 'underscore', 
    onClick: function() {console.log('clicked: ' + this.id)}, 
    onHover: function() {console.log('hovering: ' + this.id)} 
} 
_.bindAll(buttonView, 'onClick') 
$('#underscore_button').click(buttonView.onClick) 
$('#underscore_button').hover(buttonView.onHover) 
</script> 
9

最簡單的解釋,我是下一個:

initialize:function() { //backbone initialize function 
    this.model.on("change",this.render); //doesn't work because of the wrong context - in such a way we are searching for a render method in the window object 
    this.model.on("change",this.render,this); //works fine 
    //or 
    _.bindAll(this,'render'); 
    this.model.on("change",this.render); //now works fine 
    //after _.bindAll we can use short callback names in model event bindings 
}