在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());
这很好用。
我在这里俯瞰什么?
答案 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. */)
这是你想要的,它将排除每个完成的待办事项。