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

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值