先了解为什么要使用call,apply这些方法
- 例子
function cat(){ //函数声明
}
cat.prototype={ //定义其方法
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);
所以,可以看出call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。
用的比较多的,通过document.getElementsByTagName选择的dom 节点是一种类似array的array。它不能应用Array下的push,pop等方法。我们可以通过:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
这样domNodes就可以应用Array下的所有方法了。
参考
作者:杨志
链接:https://www.zhihu.com/question/20289071/answer/14644278
区别
二者的作用完全一样,只是接受参数的方式不太一样。
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
先理解下这句话的正确与否
- 作用的确都一样,为了改变函数体内部 this 的指向
- 接受的参数的区别
apply接受的是数组参数,call接受的是连续参数
按照上面分析那么这句话就是正确的。
但是实际上二者还是有区别的
就是性能上的区别,在一般的框架应用中的源代码,
会使用swich来判断使用call,还是apply;
一般参数个数小的情况下(<4||5)使用call
然后default 剩下的用apply方法
这可能是出于性能问题,反正不能说他们完全一样啊嘛,虽然功能相同但是能力不同呀
或者是因为call的参数必须一个一个列举出来所以,参数个数多了就直接用apply的方法
完全是取决于你采用哪种给函数传递参数的方式最方便。
在JS的高级程序设计第三版的P117有些许解释这两个方法在何时使用比较恰当。