JS中每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法都用于在特定的作用域中调用函数,即将一个函数绑定到另一个函数中,比如有两个函数A和B,要在B函数中调用A函数,就需要用到这两个方法,说白了就是设置函数体内this对象的值。
call()和apply()方法都接收两个参数,第一个参数都是this,第二个参数略有不同。call()方法的第二个参数是将原绑定函数的参数逐个列举出来。例:
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum1(10,20)); //30
apply()方法的第二个参数有两种,既可以是将原绑定函数的参数以数组的方式逐个列举出来,也可以是arguments对象。例:
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,[num1,num2]);
}
function callSum2(num1,num2){
return sum.apply(this,arguments);
}
alert(callSum1(10,20)); //30
alert(callSum2(10,20)); //30
事实上,传递参数并非apply()和call()的真正勇武之地;它们的真正强大之处在于能够扩充函数来赖以执行的作用域。例:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //该方法在全局作用域中调用,this对象指向window
sayColor.call(this); //将该方法绑定到全局作用域中
sayColor.call(window); //将该方法绑定到全局作用域中
sayColor.call(o); //将该方法绑定到o对象中,this指向o