我很难理解剩下的功能在下面的代码中是如何工作的。
(注释来源: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,this.done()); - >转换为:
without(array of arguments as parameters to without function);
不将第一个参数作为数组,将2 ... n个参数从数组中删除。
我不明白这个功能是如何做有用的。我错过的解释会有所帮助。
答案 0 :(得分:0)
this.without.apply(this,this.done()); - >转换为:
without(array);
不是真的。您知道的下划线函数为第一个参数提供数组可以作为 on 主干集合的方法(如下划线链接包装器)。我们假设this.done()
评估为[x, y, z]
,然后apply
调用转换为
this.without(x, y, z);
当然,一个更高效的方法就是
return this.filter(function(todo) { return ! todo.get('done'); });
// ^
答案 1 :(得分:0)
Backbone:将每个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);
};
});