每个函数都包含俩个非继承而来的方法:apply()
和 call()
,这俩个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this
对象的值,以扩充函数赖以运行的作用域。一般来讲,this
总是指向调用某个方法的对象。
比如:
var color="skyblue";
function myColor(){
console.log(this.color); //skyblue
console.log(this); //window
}
window.myColor();
由window
对象调用的 myColor
函数,内部 this
自然指向了window
,this.color
也是window.color
。
一、apply()
这个方法接收2个参数,第一个是在其中运行函数的作用域,第二个是参数数组,其中,第二个参数可以是 Array
构造函数的实例,也可以是 arguments
对象。
例子1:
var fruit="橘子";
var fruitObj={
fruit:"香蕉"
}
function changeFruit(){
console.log(this.fruit);
}
changeFruit.apply(window); //橘子
changeFruit.apply(fruitObj); //香蕉
例子2:
function sum(a,b){
return a+b;
}
function callSum1(a,b){
console.log(sum.apply(this,[a,b])); //传入Array的实例
}
function callSum2(a,b){
console.log(sum.apply(this,arguments)); //传入arguments对象
}
callSum1(10,20); //
callSum2(10,20); //
例子3:
function SuperType(fruit){
this.fruit=fruit;
this.getSuperValue=function(){
console.log(this.fruit);
}
}
function SubType(fruit){
SuperType.apply(this,arguments); //橘子
}
var instance=new SubType("橘子");
instance.getSuperValue();
二、call()
call()
方法的用法和作用与 apply()
一样,只是再填入第二参数时,必须一一列举出来。
例子1:
function sum(a,b){
return a+b;
}
function callSum(a,b){
console.log(sum.call(this,a,b));
}
callSum(10,20); //
例子2:
function SuperType(fruit){
this.fruit=fruit;
this.getSuperValue=function(){
console.log(this.fruit);
}
}
function SubType(fruit){
SuperType.call(this,fruit); //橘子
}
var instance=new SubType("橘子");
instance.getSuperValue();
总结:使用apply()
还是call()
,完全取决于你采用哪种给函数传递参数的方式最方便。如果你打算直接传入arguments
对象,或者包含函数中先接收到的也是一个数组,那么使用apply()
肯定最方便,否则,使用call()
可能更方便。(在不给函数传递参数的情况下,使用哪个方法都无所谓。)