我发现自己经常使用带有常规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
答案 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);