call()和apply()两个方法都是函数对象的方法,需要通过函数对象来调用。
当对函数调用call()和apply()时,都会调用函数执行。
// 没有传参的情况下:
function fun(){
console.log(123);
}
fun.call(); // 函数会被调用,输出123,和fun()结果一样
fun.apply(); // 函数会被调用,输出123,和fun()结果一样
不同的时,在调用call()和apply()时,可以将一个对象指定为第一个参数。
此时这个对象将会成为函数执行时的this,对象传的是谁,this就指向谁。
function fun2(){
console.log(this.name);
}
let obj = {
name:"儿子"
};
let obj2 = {
name:"父亲";
};
fun2(); // this还是window
fun2.call(obj); // 儿子 this是obj
fun2.call(obj2); // 父亲 this是obj2
fun2.apply(obj); // 儿子 this是obj
fun2.apply(obj2); // 父亲 this是obj2
// call()方法本质:修改函数中的this指向其实就是将用户设置的对象赋值给了函数中的this
call()方法可以将实参在对象之后依次传递。
但是apply()方法需要将实参封装到一个数组中统一传递。
function fun3(a,b){
console.log(a);
console.log(b);
}
let obj = {
name:"儿子"
};
fun3.call(obj,2,3); // a=2,b=3
fun3.apply(obj,2,3); // 会报错
fun3.call(obj,[2,3]); // a=2,b=3