箭头函数不绑定this,它的this来源其父所处的上下文。
通过代码来验证一下。
let obj1 = {
name: 'a',
fun1: () => {
name: 'b'
console.log(this, this.name)
}
}
obj1.fun1()
输出结果:window ‘’
箭头函数fun1()的父级是obj1,obj1的上下文是window
那么以此类推,在一个嵌套结构对象中,调用箭头函数,观察它的this,就一定不是window,而是其父级
let obj2 = {
name: 'a',
inner: function() {
name: 'b'
let fun2 = () => {
console.log(this, this.name)
}
fun2()
}
}
obj2.inner()
输出结果 :{name: ‘a’, inner: ƒ} ‘a’
这时候箭头函数中的this 指向的是obj2,name的结果不是b而是a,因为this在其父级。进行了稍微的修改。
let obj2 = {
name: 'a',
inner: function() {
name: 'b'
let fun2 = () => {
console.log(this, this.name)
}
let fun3 = function() {
console.log(this, this.name)
}
let fun4 = function() {
console.log(this, name)
}
fun2()
fun3()
fun4()
}
}
obj2.inner()
输出结果:
后两个都是window对象啊,因为fun3和fun4都可以看成是普通的函数,不是箭头函数。而普通函数的调用,this指向的是window,在这里,我又有些疑惑了,如果按照作用域链来看,为什么fun4输出的结果不是b而是空呢?
后来查了资料应该是这样的,作用域分为全局作用域和函数作用域,全局作用域不用多说,而函数作用域应该是只能在函数里,而我之前的obj2是一个对象,所以不成功?
写代码进行了一下验证
var n = 'windowN'
function fun5() {
let n = 'a';
console.log('fun5', this.n)
function fun6() {
console.log('fun6:', this, n, this.n)
}
fun6()
}
fun5()
输出结果:
因为name有特殊的含义,最好不要用name给变量起名,所以选择了n作为变量名
用var定义的变量会作为window对象的属性,在内部的fun6中,分别输出this,n,this.n,可以从输出结果来看,此时window指向的还是window对象,因为fun6本身还只是一个普通的函数罢了,不是么?但是不加this和加了this的结果是不同的,this.a指向的还是window对象的n,所以这里是应该要注意的,之前会以为这里的this 指向的父级,输出结果会是’a’
再来看这里的代码
var number = 50
let obj2 = {
number: 4,
db2: function() {
console.log('obj2', this.number, number)
function db3() {
console.log('db3', this.number, number)
}
db3()
}
}
obj2.db2()
分析输出结果
关于this的指向
普通函数的调用,指向window
对象方法调用,指向该方法所属的对象
执行obj2.db2()后,来到obj2内部,执行第一句
console.log(‘obj2’, this.number, number),这里的this.number结果是4,因为obj2.db2属于对象方法调用,所以指向该方法所属的对象,所以此时this指向obj2,不带this的name表示的window。带有this的指向似乎有些明白了,但是不带this的变量名到底指的是哪个我真的有点迷糊了。
之后执行db3(),没有使用对象方法的调用,所以this表示的window对象,结果很好理解。