请问这2个箭头函数有什么区别?

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
请教一下大家,感谢。

阅读 2.6k
2 个回答

第一个例子里,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

执行结果不一样,是因为定时器的回调函数不一样。
由于定时器的回调是在全局环境。

因为function 定义的函数会根据执行环境变化this,所以第一个函数内部this是window;
因为箭头函数会绑定定义所在的作用域,所以第二个函数this是a对象;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题