在很多高手的代码当中经常会看到foo.call(this, arg1, arg2....)或foo.apply(this,arguments),之前一直都很难理解为什么经常要用到这个呢?用这个有什么样的好处。
其实call和apply的作用都一样,都是通过参数arg及函数foo来代入指定的位置this上。
写成等式就如下:
foo.call(this, arg1, arg2, arg3......) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3......)
foo是一个方法函数,this是上下文的相关对象,arg1...是相关的实参;这里的意思代表实例化后的this。
call的例子:
var b = new B();
//给对象a动态指派b的setMessage方法,注意,a本身是没有这方法的!
b.setMessage.call(a, "a的消息");
//下面将显示"a的消息"
alert(a.getMessage());
//给对象b动态指派a的getMessage方法,注意,b本身也是没有这方法的!
上述代码指出,call可以达到无中生有的地部,只要指派this就能够拥有对应的方法同时能代入参数,即对this指派方法的实例化。
call和apply的作用就是借用人家的方法来调用,就像调用自己的函数一样。
apply的例子:
//例
print.call(window, “背” , “光” , “脚”, “本”);
//foo参数可能为多个
function foo(){
print.apply(window, arguments);
}
从上述代码中可以看出,apply更适合把函数重新封装成一个新的函数,且可以适应不同的参数数量。参数arguments,指数量不定的实参参数。即foo的实例可以为foo(arg1,arg2,arg3......)
从上面的代码可知,call与apply的作用是一样只是使用的场合并不一样而已,apply通过arguments来封装新的函数,而call是更直接的借用函数并实例化。