Backbone.js - Todo Collection - 这个返回语句到底发生了什么?

时间:2012-02-04 00:42:09

标签: javascript jquery backbone.js underscore.js

我正在回顾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语句中这些元素的用途吗?

10 个答案:

答案 0 :(得分:33)

this指的是该集合。

apply是一种javascript函数方法,允许您设置方法的上下文并向调用者发送值数组。

apply期望上下文作为第一个参数,然后是array类似数组(例如arguments),它将作为参数传递给函数

您可以使用.call执行相同操作,但第二个+参数以逗号分隔。

applycall是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 ...'之前无法加粗'!')