【发布时间】:2017-08-23 00:52:01
【问题描述】:
var test = {
literalLogger: function() {
console.log('literal')
console.log('this: ', this)
},
arrowLogger: () => {
console.log()
console.log('this: ', this)
},
nestedArrowLogger() {
this.arrowLogger();
}
}
第一个函数将 this 记录为对象。 第二个函数将其记录为窗口。 第三个函数将其记录为窗口。为什么?
【问题讨论】:
-
你所有的函数都属于一个名为“test”的对象。所以在你的第一个例子中,它确实会返回
test对象。箭头函数捕获范围,iow:它们不会将您的 this 更改为指向test,而是在它之前的上下文,在本例中为window,.. 您的第三个示例实际上是在重复第二个。 -
@Keith 这不太对。这些函数当然附加到
test对象,但这并不能保证函数中的this将是test。这完全取决于各个函数是如何调用的。你最后的评论有错字吗?第三个类似于第一个,而不是第二个。 -
为什么这被否决了?似乎是一个有效的问题。也嗨@loganfsmyth
-
见MDN Arrow Functions。 "...不绑定自己的
this" -
@loganfsmyth 实际上,这取决于函数的调用方式。在这个例子中,我假设它们是从测试中调用的。*。例如。 test.literalLogger(),当然 bind & call 可以改变事情。如果从 test.* 调用,我的意思是 3rd 与 2nd 相同,因为 2nd 已经获得了它的上下文范围。
标签: javascript ecmascript-6 arrow-functions