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

Javascript .apply和.call之间有什么区别,javascript,jquery,javascript-objects,Javascript,Jquery,Javascript Objects,我发现自己经常使用jQuery对象和常规js对象;我正在尝试找出如何在适当的时候在脚本中更频繁地使用.call和.apply。我一直在测试代码,看看它实际上是如何工作的 然而,当我在firebug中运行下面的代码(本质上只是隐藏页面上的所有div)时,我知道有jQuery的站点上,我得到了各种各样的结果;我想知道这是否是jQuery的版本,或者这段代码只是我想要解释的“bug”。调用总是有效的,但基于下面的代码,apply并不认为这是另一种方式 var myApp = {} // instant

我发现自己经常使用jQuery对象和常规js对象;我正在尝试找出如何在适当的时候在脚本中更频繁地使用.call和.apply。我一直在测试代码,看看它实际上是如何工作的

然而,当我在firebug中运行下面的代码(本质上只是隐藏页面上的所有div)时,我知道有jQuery的站点上,我得到了各种各样的结果;我想知道这是否是jQuery的版本,或者这段代码只是我想要解释的“bug”。调用总是有效的,但基于下面的代码,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对上面的代码进行firebug时,我会根据不同的站点得到不同的结果。每个有jquery.call的网站都可以运行,但对于一些网站,如jquery.com和twitter,它们都可以使用.apply和.call,但其他网站,如纽约时报和Netflix,只有.call可以运行-我猜是jquery的版本造成了差异,但有点困惑,因为numbers.div总是返回一个包含所有div的数组元素,因此我认为这将一直有效。任何解释都非常感谢,因为我仍然掌握了.call和.apply的概念-我总是参考Douglas Crockford的书,但说实话,他没有详细介绍.apply和.call。apply需要将参数作为数组传递

所以

应该和

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

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

call/apply力量实际上取决于你希望这个在被调用函数中的上下文。因为第一个参数决定了它将是什么。它们是一个很好的例子,说明在Javascript函数中,何时/何地调用函数并不重要,而是如何调用。(因此,在您的示例中,这将是
数字

.apply()
.call()
都可以工作。不管怎样,它们的第二个参数实际上都是可选的

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

.apply(contextYouWant[oneParam、twoParam等]

或者在
.call()
的实例中,分别传递参数


.call(contextYouWant、oneParam、twoParam等)

谢谢xdazz,但为什么它在某些网站上有效,而在其他网站上却不起作用呢,为什么.call在返回数组时会起作用?does.call仍然使用数组,其中as.apply只使用数组使用一个数组比另一个数组有什么好处。apply使用数组作为第二个参数,并将该数组中的所有内容作为参数传递给函数。另一方面,call将第二个参数及其后的所有参数作为参数传递给函数。@JamesDaly否,只需检查签名,
foo.call(obj,param1,param2,…)
vs
foo.apply(obj,[param1,param2,…)
ahh我想我终于明白了,你可以使用多个参数for.call但for.apply,你只需要将这些参数存储为js数组;我不知道你会使用多个参数。调用-再次感谢xdazz和Kevin B。我想我仍然有点困惑为什么它在某些网站上有效,但在其他网站上无效。我确定它与jQuery版本有关,但我明白为什么。调用现在可以用了。应用
myApp.hide.apply(numbers, [numbers.div])