6

嗨,有人可以解释为什么在剩余()函数中的骨干示例应用程序( http://backbonejs.org/examples/todos/index.html)中,使用 apply ( this.without.apply(this, this.done() ); ) 而不是this.without(this.done())

 // Filter down the list of all todo items that are finished.
done: function() {
  return this.where({done: true});
},

// Filter down the list to only todo items that are still not finished.
remaining: function() {
  return this.without.apply(this, this.done());
},

谢谢你 !

#更新

调试器输出

this.without(this.done())
[child, child, child, child]
this.without.apply(this, this.done());
[child, child, child]
4

3 回答 3

4

变量参数列表

关键是在没有写的方式:

function () {
  var args = slice.call(arguments);
  args.unshift(this.models);
  return _[method].apply(_, args);
}

它期待一个变量的参数列表,一种方法是使用 apply:

...
return this.without.apply(this, ['pass', 'these', 'arguments']);

在MDN 文档中有更多关于 apply 的内容。

于 2013-07-19T19:13:31.693 回答
2

你问这两个电话有什么区别:

this.without( this.done() )

对比

this.without.apply( this, this.done() );

为了澄清,让我们删除嵌套this.done()调用。现在第一个是:

var value = this.done();
this.without( value );

该代码显然调用this.without()并传递了一个参数,value无论this.done(). 如果value碰巧是一个数组,则整个数组作为单个参数传递。

第二个版本变成:

var array = this.done();
this.without.apply( this, array );

使用可变数量的参数调用this.without(),每个元素一个参数array。(我这次调用它array而不是value这次,因为要使这段代码有意义,它必须是一个数组。)

.apply()也设置this在被调用的函数中,因此this作为第一个参数传递只是以与常规方法调用this相同的方式传递给该函数。this.without()

于 2013-07-19T19:13:21.883 回答
0

apply 还允许您为函数指定“this”对象。有时这很重要,例如在闭包中调用它时,“this”可能与您的预期不同。

于 2013-07-19T19:17:17.027 回答