2012-08-30 26 views
4

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

但是,当我在网站上的firebug中运行我的代码(基本上只隐藏页面上的所有div)时,我知道jQuery有不同的结果;我想知道,如果它的jQuery的版本或者是这段代码有“马车”我破译为什么总是.CALL工作,但。适用不认为这将是各地根据下面的代码

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和。适用的概念 - 我始终引用道格拉斯Crockford的书,但他如实不会进入太多的细节有关。适用和.CALL

回答

4

.apply需要你通过参数作为数组。

SO

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

应该是相同

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

但是,在你myApp.hide功能,没有this,所以.call.apply第一个参数可以是任何东西,这不是没关系。

+0

感谢xdazz但它为什么在一些网站工作,但不是别人这让我困惑,为什么.CALL工作,如果它返回一个数组的话 - 不.CALL还使用数组作为地方只。适用与阵列一起使用的优点是使用一个在另一个 –

+1

。apply将数组作为第二个参数,并将该数组中的所有内容作为参数传递给该函数。 .call另一方面将第二个参数和其后的所有参数作为参数传递给函数。 –

+0

@JamesDaly不,只是检查签名,'foo.call(obj,param1,param2,...)'vs'foo.apply(obj,[param1,param2,...])' – xdazz

2

电话/申请真正在于你想要的上下文这个是在被调用的函数。第一个参数决定了它会是什么。它们是Javascript函数中的一个很好的例子,函数被调用的时间和地点并不重要,但是如何。 (因此,在您的实例,numbers

两个.apply().call()工作不管,要么为他们的第二个参数实际上是可选的。

像大家所说的,他们两个人之间唯一真正的区别就是你是否想以参数/数组的形式传递参数/参数,而不是关联数组{})。

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

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

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

相关问题