前言
解析器在调用函数时,每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象
一.this的指向
根据函数的调用方式的不同,this会指向不同的对象
1.全局作用域或者普通函数中
在全局作用域或者普通函数中,this永远都是window
console.log(this) //window
2.作为对象方法的形式调用
作为对象方法的形式调用时,this就是调用方法的那个对象
function fun(){
console.log(this.name);
}
var obj={
name:"孙悟空",
sayName:fun
};
var obj2={
name:"沙和尚",
sayName:fun
}
console.log(obj.sayName==fun);//true
obj.sayName();//孙悟空 <==> obj.name this即为obj
obj2.sayName();//沙和尚 <==> obj2.name this即为obj2
var name="全局的name";
fun();//全局的name <==> window.fun() <==> window.name
3.在构造函数中调用
在构造函数中调用时, this 指向 实例对象
function Person(age, name) {
this.age = age;
this.name = name;
console.log(this); // 此处 this 分别指向 Person 的实例对象 p1 p2
}
var p1 = new Person(18, "孙悟空");//Person {age: 18, name: "孙悟空"}
var p2 = new Person(18, "猪八戒");//Person {age: 18, name: "猪八戒"}
4.使用call()和apply()调用时
使用call()和apply()调用时,this是指定的那个对象(可以通过call()和apply()来更改this的指向)
var obj={
name:"obj"
};
var obj2={
name:"obj2"
};
function fun(){
console.log(this);
}
fun();//window
fun.call(obj);//obj
fun.apply(obj);//obj
fun.call(obj2);//obj2
fun.apply(obj2);//obj2
call()方法可以将实参在对象之后依次传递
apply()方法需要将实参封装到一个数组中统一传递
function fun(a,b){
console.log(a);
console.log(b);
}
var obj={
name:"obj",
sayName:function(){
console.log(this.name);
}
};
var obj2={
name:"obj2"
};
obj.sayName();//obj
obj.sayName.apply(obj2);//obj2 传入的实参是谁,this就指向谁
fun(obj);//{name: "obj", sayName: ƒ} undefined
fun.call(obj);//undefined undefined
fun.call(obj,2,3);//2 3
fun.apply(obj);//undefined undefined
fun.apply(obj,[2,3]);//2 3
总结
this的指向分为:
1.在全局作用域或者普通函数中,this永远都是window
2.作为对象方法的形式调用时,this就是调用方法的那个对象
3.在构造函数中调用时, this 指向 实例对象
4.使用call()和apply()调用时,this是指定的那个对象