1

以下のコードで残りの関数がどのように機能するかを理解するのに苦労しています。

(注釈付きソース: http://documentcloud.github.com/backbone/docs/todos.html )

apply についての私の理解では、最初の引数はコンテキストであり、残りの引数は、適用される関数に引数として渡す配列です。

var TodoList = Backbone.Collection.extend({
      model: Todo,
      localStorage: new Backbone.LocalStorage("todos-backbone"),
      done: function()
      {
        return this.filter(function(todo) { return todo.get('done'); });
      },
      remaining: function() 
      {
        return this.without.apply(this, this.done());
      },
});

したがって:

this.without.apply(これ、this.done()); --> 翻訳すると:

without(array of arguments as parameters to without function);

Without は、最初の引数を配列として取り、配列から削除する 2...n 個の引数を取ります。

この関数がどのように役立つのか理解できません。私が欠けているものの説明が役立ちます。

4

2 に答える 2

0

this.without.apply(これ、this.done()); --> 翻訳すると:without(array);

あまり。最初の引数に配列を受け取るアンダースコア関数は、バックボーン コレクションのメソッドとして適用できます(アンダースコア連鎖ラッパーのように)。this.done()が に評価されると仮定すると[x, y, z]apply呼び出しは次のように変換されます。

this.without(x, y, z);

もちろん、はるかにパフォーマンスの高い方法は、

return this.filter(function(todo) { return ! todo.get('done'); });
//                                         ^
于 2013-03-06T13:43:02.233 に答える
0

バックボーン: 各 Underscore メソッドを Collection#models へのプロキシとしてミックス

_.each(methods, function(method) {
    Collection.prototype[method] = function() {
      //convert arguments to array. Such as: args = [1, 2, 3]
      var args = slice.call(arguments);
      //add this.models at the begining of array. Such as: [['string'], 1, 2]
      args.unshift(this.models);
      //_[without].apply(_, [['string'], 1, 2])
      //_.without(['string'], 1, 2);
      return _[method].apply(_, args);
    };
  });
于 2013-03-20T06:26:05.580 に答える