Underscore.jsの_.bindAll()関数の説明が必要です


85

私はいくつかのbackbone.jsを学び、_.bindAll()使用されているインスタンスをたくさん見てきました。私はbackbone.jsとunderscore.jsのドキュメントページ全体を読んで、それが何をするのかを理解しようとしましたが、それでも何をするのかについては非常に曖昧です。アンダースコアの説明は次のとおりです。

_.bindAll(object, [*methodNames]) 

methodNamesで指定されたオブジェクト上のいくつかのメソッドをバインドして、呼び出されるたびにそのオブジェクトのコンテキストで実行されるようにします。イベントハンドラーとして使用される関数をバインドするのに非常に便利です。そうしないと、かなり役に立たないこれで呼び出されます。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...

おそらく別の例や口頭での説明をしてここで手助けできるなら、何でもいただければ幸いです。もっとチュートリアルや例を検索しようとしましたが、必要なものを提供するものはありませんでした。ほとんどの人はそれが自動的に何をするかを知っているようです...


24

回答:


67

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 === theObject、メソッドとして呼び出さなくても(theObject.method())。


@ThiefMaster "これらの関数名を追加の引数として明示的に_.bindAll()に渡します。" 申し訳ありませんが、まだあなたの例から学び、ここでその意味を理解しようとします:プロトタイプで定義された関数は、_。bindAllの下のオブジェクトに自動的にバインドされないということです。これを達成する場合は、オブジェクトの最初のパラメータ。その関数がプロトタイプで定義されている場合、2番目のパラメーターは関数名ですか?
Nik So

9
Yehuda Katzによるこのブログ投稿this、JavaScriptで非常によく説明しています。
Henrik N

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
}

-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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.