【发布时间】:2019-09-03 10:30:33
【问题描述】:
我之所以这么问,是因为我读过关于这个问题的类似(但不相等)的问题。
据我所知,我明白为什么这段代码会不工作:
let myObj = {
name: 'inner text',
myFunction: () => {
console.log("before text " + this.name + " after text");
}
}
myObj.myFunction();
原因:创建箭头函数的上下文(myObj)属于全局范围(即window或undefined,取决于严格模式等)。
我明白了。但是在嵌套对象字面量的情况下,不应该是外部对象字面量作为箭头函数的继承上下文,如下例所示?
let outer = {
name: 'outer',
obj: {
name: 'inner',
myFunction: () => {
console.log("before text " + this.name + " after text");
}
}
}
outer.obj.myFunction();
我希望this 指的是outer 的上下文,这是嵌套obj 的对象字面量。
事实并非如此,也是我无法正确理解这个继承的词法范围的原因。
有人能解释一下为什么会这样吗?
【问题讨论】:
-
词法作用域是一样的,只有函数创建作用域。只是不要将箭头函数用作方法。或者,如果您一定要这样做,请使用带有
new的旧的良好构造函数,那么您将拥有正确的this值的适当范围。 -
作用域是基于函数/构造函数创建的。所以当你使用箭头函数时,作用域是与父函数关联的,而不是对象
-
如果普通对象字面量的值没有特殊的
this值,为什么嵌套对象字面量会有所不同?
标签: javascript ecmascript-6 arrow-functions