this 指向问题

箭头函数默认指向上下文对象,如果没有上下文对象,则指向window。

箭头函数this指向是静态的,call、apply、bind方法也无法改变其指向。

回顾:bind只改变this指向,不调用;call,apply改变之后再调用,call=>[],apply=>{}

以下是一些例子。

基础引入

1
2
3
4
function a(){
console.log(this)
}
a()

猜猜这个打印出什么?

答案是window

为什么呢?因为全局的方法会被挂载到window上,相当于window.a()

无箭头函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const obj = {
name:'huahua',
func: function() {
const obj2 = {
name:'lala',
func2: function() {
console.log(this)
}
}
obj2.func2()
}

}
obj.func()

可以看到打印的是obj2,因为func2的调用者是obj

总结:指向上一个调用者

有箭头函数

情况一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const obj = {
name:'huahua',
func: function() {
const obj2 = {
name:'lala',
func2: ()=> {
console.log(this)
}
}
obj2.func2()
}

}
obj.func()

image-20220624201743493

可以看到打印结果是obj,func2是箭头函数,this指向上下文的this,即obj2的this,obj2的this指向obj,所以最终this指向obj

情况二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const obj = {
name:'huahua',
func: ()=> {
const obj2 = {
name:'lala',
func2: ()=> {
console.log(this)
}
}
obj2.func2()
}

}
obj.func()

image-20220624201636676

可以看到打印结果是window,

首先fun2是箭头函数,无直接调用者this等于它的上下文的this,即obj2的this,

又因为obj2在箭头函数内,所以其this=箭头函数的this,

因为func是箭头函数,它的this=它上下文的this,即obj的this,

obj的this指向window,所以最终打印window