Backbone.js中的Todo应用程序“_underscore.js _.without”

vsaztqbk  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(193)

我很难理解下面代码中剩下的函数是如何工作的。
(注解来源: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);
  • without* 将第一个参数作为数组,并从数组中删除2... n个参数。

我不明白这个函数是如何做任何有用的。这是什么原因呢?

rvpgvaaj

rvpgvaaj1#

this.without.apply(this,this.done());--〉翻译为:without(array);
其实不然。你所知道的以数组作为第一个参数的下划线函数可以作为 Backbone.js 集合上的方法应用(就像下划线链接 Package 器一样)。假设this.done()的计算结果为[x, y, z],则apply调用转换为

this.without(x, y, z);

当然,一个更有效的方法是

return this.filter(function(todo) { return ! todo.get('done'); });
//                                         ^
44u64gxh

44u64gxh2#

Backbone.js 集合具有一堆Underscore函数的绑定方法版本,因此

aCollection.filter(iteratee)

(大致)等同于

_.filter(aCollection.models, iteratee)

和/或

aCollection.without(model1, model2, model3, ...)

(大致)等同于

_.without(aCollection.models, model1, model2, model3, ...)

还有很多人我写的是“粗略”,因为绑定方法的版本会干涉可迭代对象简写的解释方式,至少现在是这样。
无论如何,done方法返回一个模型数组,其中done属性为truthy。without方法将此集合反转;它返回done属性为falsy的模型数组。

相关问题