1.call和apply作用
call和apply都是为了改变某个函数运行时的context即上下文而存在的,换句话说,就是为了改变函数体内部this的指向。因为JS函数存在定义时上下文、运行时上下文以及上下文可以改变这样的概念。下面例子可以说明它们存在的原因:
在js oop中,我们经常这样定义:
function Cat(){
}
cat.property = {
food:'fish',
say:function(){
alert('I love '+this.food);
}
}
var blackCat = new Cat();
blackCat.say();
但,如果我们有一个对象whiteDog={food:’bone’},我们不想对它重新定义say方法,那么我们可以通过call或者apply调用blackCat的say方法:
blackCat.say.call(whiteDog);
blackCat.say.apply(whiteDog);
从上面例子可以看出call和apply是为了动态改变this出现的,当一个object对象没有某个方法,但其他对象有,就可以借助call或者apply用其他对象的方法。
再举一个常用的例子:
document.getElementsByTagName(‘*’)是一种类似array的array,不能用Array下的方法,通过call,它可以调用Array的slice方法,彻底变成数组,就可以采用Array的所有方法了
var domNodes = Array.property.slice.call(document.getElementsByTagName('*'));
2.call和apply区别
二者的作用完全一样,只是接受参数的方式不太一样。
若一个函数func定义如下:
var fun = function(arg1,arg2);
可以通过如下方式调用:
func.call(thisOject,arg1,arg2);//thisObject可选,是要指定的上下文,默认为Global对象
func.apply(thisObject,[arg1,arg2]);
call需要把参数按顺序传递进去,而apply则是把参数放到数组里。
JavaScript中,某个函数的参数数量是不固定的,因此,当参数数量明确知道时,用call;参数数量不确定时,用apply,把参数push进数组传递进去。