var a = {
name: "david",
sayname: () => {setTimeout(function() {
console.log(this.name)
}, 10)}
}
var name = "bob"
a.sayname() // 结果为bob
var a = {
name: "david",
sayname: function() {setTimeout(() => {
console.log(this.name)
}, 10)
}
}
var name = "bob"
a.sayname() // 结果为david
查了很多资料,都说箭头函数内部没有this
,在使用时会指向其词法作用域里的this
。
对于第一种情况不太理解,为什么结果是bob
,而不是指向david
?
请教一下大家,感谢。
第一个例子里,
this
是出现在setTimeout
的回调函数里,这个一个匿名函数,不是箭头函数。所以有关箭头函数的一切在这里不适用,这个函数是有this
的。做为
setTimeout
的回调,这个函数的this
是由setTimeout
确定的。根据 setTimeout 的定义,这个回调的this
是全局对象。于是,
this.name
是全局的bob
。第二个例子里,
setTimeout
的回调是一个箭头函数。它没有this
。于是setTimeout
对其this
的控制无效(因为它没有)。它的this
一定来自与它所在的词法作用域,这个词法作用域是a.sayname
方法。在使用
a.sayname()
方式调用这个方法时,这个方法里的this
就是a
。于是,setimeout
回调的箭头函数中,this
也是a
。此时,
this.name
就是a.name
,也就是david
。