在this指向问题上我听说过一句话:谁调用它它就指向谁。
下面在不同的情况下看看这句话
一、全局环境中的this
function o1(){
console.log(this);
}
function o2(){
'use strict'
console.log(this);
}
o1(); //window
o2(); //undefined
在全局环境下,非严格模式下this指向window,而严格模式下this指向undefined。
let o1 = {
num: 2,
fn: function(){
console.log(this); //{num: 2, fn: ƒ}
console.log(this.num); //2
}
}
o1.fn()
通过上面代码段可以看出此时this指向o1,可以得出结论:如果函数中的this被上级对象调用,那么this指向的就是上一级对象,否则指向全局环境。
二、上下文对象调用中的this
let student ={
name:'xiaoming',
fn: function(){
return this.name
}
}
student.fn() //'xiaoming'
let student ={
name:'xiaoming',
brother:{
name:'danne',
fn: function(){
return this.name
}
}
}
student.brother.fn() //'danne'
结合上下两个代码段可以得出结论:this会指向最后调用它的对象。
三、通过call、apply、bind改变this指向
let o1 = {
text:'o111',
fn:function(){
return this.text
}
}
let o2 = {
text:'o222',
}
console.log(o1.fn.call(o2)); //o222
call、apply、bind会改变相关函数的this指向,上面代码段通过call将this指向改变,指向o2。
四、构造函数中的this
//场景1
function Foo(){
this.user = "xiaoming";
const o = {user:'xiaoliu'};
return o ;
}
let instance = new Foo;
console.log(instance.user); //xiaoliu
//场景2
function Foo(){
this.user = "xiaoming";
return 1
}
let instance = new Foo;
console.log(instance.user); //xiaoming
如果构造函数中显式返回一个值,返回的是一个对象(复杂类型)的话,this指向的就是这个返回的对象;如果返回的是一个基本类型,那么this还是指向实例。
五、箭头函数中的this指向
let o = {
fn:function(){
setTimeout(function(){
console.log(this);
})
}
}
console.log(o.fn()); //window
let o = {
fn:function(){
setTimeout(()=>{
console.log(this);
})
}
}
console.log(o.fn()); //{fn: ƒ}
代码段看出箭头函数指向了o,结论:在箭头函数中,this的指向是由外层(函数或全局)的作用域来决定的。