JS函数对象方法call apply
感谢:尚硅谷李立超老师的讲解
普通的方法调用
function fun(){
console.log("我是fun方法");
}
fun();
使用call() 和 apply()
- 这两个方法都是函数对象的方法,需要通过函数对象来调用
- 当对函数调用call()和apply()都会调用函数执行
- 在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行时的this
function fun(){
console.log("this:"+ this);
}
fun();
//this:[object Window]
fun.call();
//this:[object Window]
fun.apply();
//this:[object Window]
var obj = {
name:"obj",
sayName:function(){
console.log(this.name);
}
};
var obj2 = {
name:"obj2",
sayName:function(){
console.log(this.name);
}
}
fun.call(obj);
//this:[object Object]
fun.apply(obj);
//this:[object Object]
obj.sayName.call(obj2);
//obj2
obj.sayName.apply(obj2);
//obj2
call()方法可以将实参在对象之后依次传递
apply()方法需要将实参封装到一个数组中统一传递
function fun(a,b){
console.log("a:"+ a);
console.log("b:"+ b);
}
var obj = {
name:"obj",
sayName:function(){
console.log(this.name);
}
};
fun.call(obj);
//a:undefined
//b:undefined
fun.call(obj,2,3);
//a:2
//b:3
fun.apply(obj,[2,3]);
//a:2
//b:3
总结this的情况:
- 以函数方式调用的时候,this永都是window对象
- 以对象方法调用的时候,this是调用的那个对象
- 以构造函数的形式调用时,this是新创建的那个对象
- 使用call() 和 apply()方法调用时,this是指定的那个对象