apply()和call()两个方法的基本作用都是:
改变执行上下文(执行环境)
什么是执行上下文?
其实我对这个执行上下文的具体含义也不是很能理解,在查过百度中,得到一个比较通俗能理解但是比较浅显的说法就是:
在函数被调用时,this的指向就是执行上下文。
而this指向的永远是调用该方法的对象
即函数被调用的时候,调用该方法的对象就是执行上下文
apply()和call()的运用
apply()和call()似乎运用的场景有很多
但是最近在学习中用到一个场景是借
用已封装好的的方法
就好比如
当对象A已经有一个自己特殊的方法,
对象B没有对象A的那个方法,但是对象B需要使用到对象A的那个方法,
就可以通过apply()或者call()方法去借用对象A的方法
而且借用对象A的方法会比重新为对象B去扩展一个已经存在可用的方法来得快,并且方便
基本用法
/*apply()方法 obj借用了function*/
function.apply(obj [, argArray])
function sub(a+b){
console.log( a+b) // 10
}
var obj = {
name:"obj"
}
sub.apply(obj,[4,6]); 10
/*call()方法 obj借用了function*/
function.call(obj[,arg1[,arg2[,argN]]]])
function show(name){
console.log(name)
}
var myObj = {
name:"hello"
}
show.call(myObj,'obj'); obj
共同点:
调用apply()和call()的function必须是函数
obj都是改变后的执行上下文,即需要借用function的对象
不同点:
apply()方法:
argArray是传入给function使用的参数,是一个数组,即使只有一个参数也需要以数组的形式出现
call()方法:
可以接受多个arg1、arg2、....argN个参数,obj后的参数是一个参数列表
所以,由此可知apply和call的主要作用都是一样的,只是传入的参数不同
apply()方法传入function的 参数必须是数组的形式
call()方法传入function的参数是一个参数列表