Backbone示例应用程序和javascript适用

时间:2013-07-19 19:06:00

标签: javascript backbone.js

嗨,有人可以解释为什么在剩余()函数中的骨干示例应用程序(http://backbonejs.org/examples/todos/index.html)中使用apply( this.without.apply(this,this。完成()); )而不是 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());
},

谢谢!

#UPDATE

调试器输出

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

3 个答案:

答案 0 :(得分: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 documentation

答案 1 :(得分:2)

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

this.without( this.done() )

VS

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传递给该函数,方式与常规{相同} {1}}方法调用。

答案 2 :(得分:0)

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