.apply和.call之间有什么区别?

时间:2012-08-30 05:03:14

标签: javascript jquery javascript-objects

我发现自己经常使用带有常规js对象的jQuery对象;我试图弄清楚如何在适当的时候在我的脚本中更频繁地使用.call和.apply。我一直在测试代码,看看它是如何工作的。

然而,当我在下面运行我的代码(基本上只是隐藏页面上的所有div)在我认识的网站上的firebug中我得到了不同的结果;我想知道它是否是jQuery的版本,或者这个代码只是'buggy'我要解读为什么.call总是有效但是.apply并不认为它会基于下面的代码反过来

var myApp = {} // instantiate an empty objct
myApp.hide = function (whatever) {
   that = whatever
   $(that).hide()
}
var Numbers = function (object) {
this.object = object;
}

Numbers.prototype.div = $('div');
var numbers = new Numbers();
numbers.div
myApp.hide.call(numbers, numbers.div)
myApp.hide.apply(numbers, numbers.div)

当我使用.call或.apply扫描上面的代码时,我会根据网站获得不同的结果。每个拥有jquery .call的网站都可以使用,但是对于像jQuery.com和twitter这样的网站,两者都可以使用.apply和.call,但其他网站只有纽约时报和Netflix .call有效 - 我猜它是版本的jQuery造成了差异,但我有点困惑,因为numbers.div总是返回页面上所有div元素的数组,所以我认为这将一直有效。任何解释都是值得赞赏的,因为我仍然掌握着.call和.apply的概念 - 我总是参考Douglas Crockford的书,但实际上他没有详细介绍.apply和.call

2 个答案:

答案 0 :(得分:4)

.apply需要您将参数作为数组传递。

SO

myApp.hide.call(numbers, numbers.div)

应与

相同
myApp.hide.apply(numbers, [numbers.div])

但是,在myApp.hide函数中,没有this,因此.call.apply的第一个参数可以是其他任何内容,无关紧要。

答案 1 :(得分:2)

通话/应用的强大功能实际上在于您希望位于被调用函数中的上下文。对于第一个参数确定它将是什么。它们是Javascript函数中的一个很好的例子,调用函数的时间/位置无关紧要,但如何。 (所以在你的实例中,这个将是numbers

.apply().call()都可以正常工作,其中任何一个的第二个参数实际上都是可选的。

就像每个人都说的那样,两者之间唯一真正的区别在于你是否要将参数/参数作为数组传递(数值数组[],而不是关联数组{})。

.apply(contextYouWant, [oneParam, twoParam, etc]);

或者在.call()的实例中,您可以单独传递参数。

.call(contextYouWant, oneParam, twoParam, etc);