0

このチュートリアルに従ってbackbone.jsを学習していますが、最初の例を理解する上で問題が発生します。

(function($){
  var ListView = Backbone.View.extend({
    ...
    initialize: function(){
      _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods

       this.render(); // not all views are self-rendering. This one is.
    },
    ...
  });
  ...
 })(jQuery);

Q1:なぜ使用するのですか(function($){})(jQuery); 完全にうまく機能する代わりに(function(){})();

Q2:何をし_.bindAll(this, 'render')ますか?メソッド内の「this」のコンテキストの喪失をどのように修正しますか?

4

2 に答える 2

8

Q1:jqueryをパラメーターとして渡すことで、次の2つのことが可能になります。

  1. 2つのバージョンのjqueryを使用する必要が生じた場合-準備ができています
  2. モジュールパターンは、適切にカプセル化され、依存関係が明確に定義されているものとして考えた方がよいでしょう。したがって、jqueryがパラメーターであると宣言することで、明確な依存関係を宣言します。確かにそれを行う他の方法(RequireJSなど)がありますが、これも方法です

Q2:特定のメソッドbindAllにバインドするUnderscore.jsのユーティリティメソッドです。thisしたがって、そのメソッドが呼び出されると(たとえば、コールバックとして)、そのメソッドthis内で正しいメソッドが使用されます。

例えば:

(function($){
  var ListView = Backbone.View.extend({
    ...
    initialize: function(){
        // fixes loss of context for 'this' within methods
        _.bindAll(this, 'render', 'makestuff'); 

        this.render(); // not all views are self-rendering. This one is.
    },
    ...
    makestuff : function() { 
        ... 
        this.stuff = ... // some action on the list's instance
    }
  });
  ...
 })(jQuery);

コードの一部で、次のようなことをします。

var list = new ListView({...});
$('#button').on('click', list.makestuff);

thisinmakestuffメソッドは上記への参照であり、関数が実際にその内部で呼び出されたときlistのコンテキストではありません。onmakestuff

実際の実装は、関数の実行のコンテキストを特定のオブジェクトにバインドするために関数をapply使用することに依存しています。call

于 2012-12-28T08:47:52.617 に答える
2

(function($){})(jQuery)jQueryそれをとして使用している自己実行に渡され$ます。$これにより、他のライブラリや他のバージョンのjQueryとの干渉を心配することなく、クロージャー内でシンボルを安全に使用できるようになります。この方法の一般的な例は、クロージャー内で速記を渡してwindow使用することです。document

(function(w, d, $){
$(w).resize(function({}); //equals $(window) now
})(window, document, jQuery);

アンダースコア_.bindAllは次のことを行います。

methodNamesで指定されたオブジェクト上のいくつかのメソッドをバインドして、呼び出されるたびにそのオブジェクトのコンテキストで実行されるようにします。イベントハンドラーとして使用される関数をバインドするのに非常に便利です。そうしないと、かなり役に立たないこれで呼び出されます。methodNamesが指定されていない場合、オブジェクトのすべての関数プロパティがそれにバインドされます。

方法については、注釈付きのソースを参照してください。

于 2012-12-28T08:52:57.090 に答える