我正在回顾Backbone todo列表并对该集合提出疑问。
以下是代码:
window.TodoList = Bacbone.Collection.extend({
model: Todo,
localStorage: new Store("todos"),
done: function() {
return this.filter(function(todo){return todo.get("done")})
},
remaining: function() {
return this.without.apply(this, this.done());
}
})
我理解这里发生的一切,除了'剩余'功能。
return语句:return this.without.apply(this, this.done());
正在使用下划线方法的代理 - _.without
根据Underscore的文档,这就是:
without_.without(array,[* values])返回数组的副本 删除了所有值的实例。 ===用于平等 测试
_。没有([1,2,1,0,3,1,4],0,1); => [2,3,4]
所以,我得知它是在没有'done'属性且值为'true'的情况下返回集合中的所有内容。
我不明白的是被绑定到它的'apply'功能。这不会出现在Backbone文档或Underscore文档中。至少在任何地方我都找不到它。
任何人都可以详细解释Return语句中这些元素的用途吗?
答案 0 :(得分:33)
this
指的是该集合。
apply
是一种javascript函数方法,允许您设置方法的上下文并向调用者发送值数组。
apply
期望上下文作为第一个参数,然后是array
或类似数组(例如arguments
),它将作为参数传递给函数
您可以使用.call
执行相同操作,但第二个+参数以逗号分隔。
apply
和call
是javascript原生的。
所以......
return this.without.apply(this, this.done());
方法this.done()
返回一个数组,但使用集合的上下文并传递一系列值,以便通过without
方法忽略。这反过来又会返回集合中未完成的所有待办事项。
示例:
_.without([1,2,3,4],1,2); === _.without.call([], [1,2,3,4], 1, 2);
答案 1 :(得分:6)
我的理解是,在这种情况下,使用apply
是多余的,remaining
可以缩短如下:
remaining: function() {
return this.without(this.done());
}
据我了解,使用apply
的唯一原因是,如果您希望(或需要)更改without
将要操作的上下文项。在这种情况下,我们没有必要这样做。
如果我错了,我真的(真的!)想要解释为什么apply
在这里是必要的。
答案 2 :(得分:3)
apply
调用一个函数,并将该函数上下文中的this
绑定到传递的第一个参数(在本例中为Collection实例TodoList
)。第二个参数是要传递给without
的参数数组。
顺便说一下,apply
不是Backbone的东西 - 它是JavaScript原生的。
答案 3 :(得分:1)
原因
this.without.apply(this, this.done())
是“_.without”不接受将要作为单个数组([])参数排除的项数组作为参数
请参阅此处_.without to accept array as second argument
apply ,它是JS Function.prototype的一部分,这里是一个将排除项注入单个数组参数的解决方法
答案 4 :(得分:1)
在这种情况下使用apply是多余的,因为骨干集合正在正确地完成工作。 http://backbonejs.org/docs/backbone.html#section-122
我们可以像这样使用下划线:_.without.apply(this,this.done())或这样的骨干绑定:this.without(this.done)使用骨干绑定。
答案 5 :(得分:0)
请查看下划线文档: 像这样:
without_.without(array,[* values]) 返回数组的副本,其中删除了所有值的实例。
_。没有([1,2,1,0,3,1,4],0,1); => [2,3,4]
答案 6 :(得分:0)
我将函数更改为this并在TODO列表应用程序中得到了完全相同的结果:
remaining: function () {
return this.filter(function (todo) {
return !todo.get('done');
});
}
我仍然不明白如何申请成为一个没有的方法,我知道申请是一个Javascript函数,但后来我读了documentation for apply并理解在这种情况下没有被用于面向对象方式(见http://underscorejs.org/#chain)。
事实上, apply 可以传递 null 而不是这个作为上下文,它不会改变结果,因为它不是完全使用:
return this.without.apply(null, this.done());
注意第一个 this 是实际的模型集合,没有,通过 apply 中的第二个参数,这是完成的数组(已完成)任务,正在生成待处理的待办事项任务数组。
顺便说一句,最新版本的TODO应用程序将完成功能重命名为已完成。
答案 7 :(得分:0)
这里this.without()委托给_.without()函数。 _.without()需要一个数组和元素作为参数而不是数组。通过使用apply(),以正确的方式调用_.without()。
var obj = {
f1: function(a,b,c){}
};
Now obj.f1(1,2,3) == obj.f1.apply(obj, [1,2,3]).
使用此信息,this.without(this.complete())将数组传递给without方法。但是没有方法需要将各个元素作为参数传递。这可以使用Function.apply()完成。
答案 8 :(得分:0)
fscanf
函数需要从without
中删除的元素列表。
this
返回一个数组,因此它不是this.completed()
函数所期望的。
without
是一个本机JavaScript函数,它调用一个函数,将apply
上下文设置为第一个参数,将数组设置为第二个参数。该参数作为其列表参数传递给原始函数。
在这种情况下,this
将参数传递给apply
中的without
,满足this.completed()
的期望。
总之,在这种情况下,without
是必要的。
答案 9 :(得分:-1)
对不起,我这是一个全新的@t这个东西,但不能fn.remaining(也)声明为:
返回this.filter(function(todo){return!todo.get(“done”)})
将此说明为澄清请求,而不是替代声明:)
(编辑:在'todo.get ...'之前无法加粗'!')