Js中可以通过call和apply来代替另一个对象调用一个方法,将一个函数对象上下文从初始上下文改变为thisObj指定的新对象。简而言之,改变函数执行的上下文,而call和apply的基本区别在于他们传参不同。
call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null.参数以逗号分开传值,参数可以是任何类型。
apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,而参数可以是数组或者arguments对象
call方法的定义:调用一个对象的另一个方法,以另一个对象替换当前对象。
由于function()也是对象,所以每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
例如:
function sum(a,b){
return a * b;
}
function callSum1(a,b){
return sum.apply(this,argument);
}
function callSum2(a,b){
return sum.apply(this,[a,b]);
}
alert(callSum1(4,5));//20
alert(csllSum2(4,5));//20
call()和apply()方法实际上的作用相同,它们的区别仅仅在于接受参数的方式不同,对于call而言,第一个参数this值没有变化,变化的是其余参数都直接传递给函数。这意味着如果使用call()方法,则参数需要一一列举出来:
function sum(c,d){
return c * d;
}
function callSum1(c,d){
return sum.call(this,c,d);
}
alert(callSum(3,4));//12
结果可知,使用call()或者apply()都没有区别,取决于用哪种传递方式方便,如果传入的是argument对象或数组,那么使用apply()会更加方便。
若call()和apply()用于回调函数中,开发过程中需要改变回调函数的执行上下文
回调函数定义:函数A作为参数传递至另一个函数B中,并且函数B执行函数A。