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){ |
04 | function example(a, b , c , d){ |
06 | print.call( this , a, b, c, d); |
09 | print.apply( this , arguments); |
11 | print.apply( this , [a, b, c, d]); |
14 | example(”背” , “光” , “脚”, “本”); |
在这场景中, example方法内,a, b, c, d作为方法传递的参数, 方法分别运用了apply, call去借print方法来调用,
最后一句由于直接调用example方法,所以在该方法中的上下文对象this就是window对象。
所以call,apply方法他们除了第一个参数,即执行时上下文对象相同外,call方法的其他参数将依次传递给借用的方法作参数,而apply就二哥参数,第二个参数为一个数组传递,
所以可以说成
call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.
应用场景:
当参数明确时可用call,当参数不明确时可用apply结合arguments。
2 | print.call(window, “背” , “光” , “脚”, “本”); |
5 | print.apply(window, arguments); |