4

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

但是,当我在我知道有 jQuery 的网站上的 firebug 中运行下面的代码(实际上只是隐藏了页面上的所有 div)时,我得到了不同的结果;我想知道它是 jQuery 的版本还是这个代码只是“错误”我要破译为什么 .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

4

2 回答 2

4

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

所以

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

应该与

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

但是,在您的myApp.hide函数中,没有,因此orthis的第一个参数可以是其他任何参数,这没关系。.call.apply

于 2012-08-30T05:08:33.353 回答
2

call / apply的力量实际上在于您希望在被调用函数中的上下文。第一个参数决定了它将是什么。它们是 Javascript 函数如何调用的一个很好的例子,函数何时/何地被调用并不重要,但如何. (所以在你的例子中,将是numbers

两者都.apply()可以.call()工作,它们中的任何一个的第二个参数实际上是可选的。

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

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

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

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

于 2012-08-30T05:18:37.633 回答