为什么在这个主干todo-mvc示例应用程序中需要“应用”?

时间:2013-11-09 01:21:26

标签: javascript backbone.js

在Backbone Todo MVC source中,函数的原生 apply 方法用于调用Underscore方法不带,我不明白为什么它是必要的。

// Filter down the list of all todo items that are finished.
completed: function() {
  return this.filter(function( todo ) {
    return todo.get('completed');
  });
},

// Filter down the list to only todo items that are still not finished.
remaining: function() {
  return this.without.apply( this, this.completed() );
},

与其他Underscore方法(例如过滤器)相比,对没有的调用看起来不合适。我使用Backbone源进行了双重检查,以确保不带不会以不同方式混合到Collection对象中。果然,事实并非如此。

这是下划线方法附加到Collection的方式:

_.each(methods, function(method) {
  Collection.prototype[method] = function() {
    var args = slice.call(arguments);
    args.unshift(this.models);
    return _[method].apply(_, args);
  };
});

正如预期的那样 - Collection的模型已作为第一个参数传递。此外,由于在Collection对象上调用方法,将被正确限制。

我通过将方法更改为以下

来验证这一点
this.without(this.completed());

这很好用。

我在这里俯瞰什么?

2 个答案:

答案 0 :(得分:3)

我认为你不会忽略任何东西。这只是对apply的不必要的调用。可能作者最初写了以下内容(可能是早期版本的主干)。

// Filter down the list to only todo items that are still not finished.
remaining: function() {
  return _.without.apply( this, this.completed() );
},

答案 1 :(得分:2)

Underscore's without将数组作为其第一个参数,并将数组列表从数组中排除以供以下参数使用。在Backbone的情况下,undercore方法正在处理的数组是集合内部的模型数组(collection.models),要排除的值列表是已完成的待办事项。所以它基本上是

_.without.apply(collection.models, this.completed())

如果没有apply,则将数组作为第二个参数传递给_.without,这将尝试从数组中排除数组

_.without(collection.models, [completedTodo1, completedTodo2 /* , etc */]);

但是使用apply,已完成的待办事项将作为单独的参数传递,即:

_.without(collection.models, completedTodo1, completedTodo2 /* , etc. */) 

这是你想要的,它将排除每个完成的待办事项。