您的位置:首页 > 移动开发

关于javascript中apply()和call()方法的区别

2013-10-14 15:32 661 查看
javascript动态变换运行时上下文特性主要体现在apply、call二个方法的运用上。

apply,call都属于Function.prototype的一个方法,它是Javascript引擎内在实现的,因此每个方法都有apply和call属性。

相同点:二个方法产生的作用是完全一样的。

不同点:方法传递的参数不同。



    foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3

   foo是一个方法,this是方法执行时上下文相关对象,arg1,arg2,arg3是传递给foo的参数。这里所谓的方法执行时上下文相关对象,
如果有面向对象的编程基础,那很好理解,就是在类实例化后对象中的this.

在javascript中,代码总是有一个上下文对象,代码处理该对象之内,上下文对象是通过this变量来 

体现的,这个this变量永远指向当前代码所处的对象中。

下面举个例子:

01
function
 
print(a,
b, c, d){
02
alert(a
+ b + c + d);
03
}
04
function
 
example(a,
b , c , d){
05
//用call方式借用print,参数显式打散传递
06
print.call(
this
,
a, b, c, d);
07
//用apply方式借用print,
参数作为一个数组传递,
08
//这里直接用JavaScript方法内本身有的arguments数组
09
print.apply(
this
,
arguments);
10
//或者封装成数组
11
print.apply(
this
,
[a, b, c, d]);
12
}
13
//下面将显示”背光脚本”
14
example(”背”
, “光” , “脚”, “本”);
在这场景中, example方法内,a, b, c, d作为方法传递的参数, 方法分别运用了apply, call去借print方法来调用,
最后一句由于直接调用example方法,所以在该方法中的上下文对象this就是window对象。
所以call,apply方法他们除了第一个参数,即执行时上下文对象相同外,call方法的其他参数将依次传递给借用的方法作参数,而apply就二哥参数,第二个参数为一个数组传递,

所以可以说成

call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.

应用场景:

当参数明确时可用call,当参数不明确时可用apply结合arguments。

1
//例
2
print.call(window,
“背” , “光” , “脚”, “本”);
3
//foo参数可能为多个
4
function
 
foo(){
5
print.apply(window,
arguments);
6
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript apply call