这两个函数都是函数的方法,所以只有函数才能够打点调用call和apply(),表示用指定的上下文执行这个函数,作用是完全一致的,唯一的区别只是传参列表不一样。
实例 :
function fun(){
console.log(this.userName)
}
var obj = {
userName : "ceshi"
}
fun(); // - >undefined ; 因为window并没有userName属性,这时候this指向的是window
fun.call(obj); // -> ceshi; 将obj对象作为函数的上下文,所以这时候this指向的是obj
fun.apply(obj); //-> ceshi ; 作用于call()完全一致。
二者不同之处在于call()传参是罗列的方式,apply()是以数组的方式传递:
function fun(a , b , c){
console.log(a + b + c)
console.log(this.a + b + c)
}
var obj = {
a : 10,
userName : "ceshi"
}
var a = 2;
fun(1,2,3);
fun.call(obj,obj,8,10);
fun.apply(obj,[obj,2,5]);
在一些特定的场合可以妙用apply方法,例如求一个数组的最大数。已知的方法有Math.max(),但是该方法只能接收罗列的传参,也就是Math.max(111,222,333)这种格式,所以我们可以用apply将数组传进去。
Math.max.apply(window,[111,222,333]);