每个函数都包含两个非继承而来的方法:apply()和call()。;
call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;
作用
call()方法和apply()方法的作用相同:改变this指向。
区别
他们的区别在于接收参数的方式不同:
call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。
apply():传递给函数的是参数数组或者arguments类数组对象
如下代码做出解释:
function add(c, d){
return this.a + this.b + c + d;
}
var obj = {a:1, b:3};
add.call(obj , 5, 7); //更改其作用域为obj 1 + 3 + 5 + 7 = 16
add.apply(obj , [10, 20]); //更改其作用域为obj 1 + 3 + 10 + 20 = 34
结论:两者的作用方式相同,它们的区别在于接收参数的方式不同,对于call()而言,第一个参数this与apply()相同,其他的参数必须直接传给函数,要一个一个的列出来,而对于来说,apply()可以接收一个数组或arguments对象。所以如何选择二者,在于哪种给函数传参数的方式最简单。在不给函数传递参数的情况下,使用哪种方法都无所谓。
传递参数并非call()和apply()真正的作用,真正强大的地方是能修改函数运行的作用域
示例代码:
window.color="red";
var obj={
color:"blue"
}
function showColor(){
console.log(this.color);
}
showColor();//red,当前作用域是window,this表示window
showColor.call(this);//red,this当前作用域为window
showColor.call(window);//red,当前作用域是window
showColor.call(obj);//blue,当前作用域是obj,this表示obj
如果不使用call和apply改变作用域的话,对象则需要跟函数耦合关联,将showColor函数放到obj对象中,然后通过obj来调用该函数以此改变运行环境为obj对象,显得耦合度大且复杂。
window.color="red";
var obj={
color:"blue"
}
function showColor(){
console.log(this.color);
}
showColor();//red,当前作用域是window,this表示window
obj.showColor=showColor;//将函数赋值给obj对象作为其属性
obj,showColor();//blue,当前运行环境为obj
原文地址:https://blog.csdn.net/mandyucan/article/details/80820139