【发布时间】:2021-03-23 00:42:59
【问题描述】:
我在输入问题时发现了这个疑问,但我认为为未来的开发人员记录这一点仍然有意义。
寻求帮助以了解以下输出:(主要是案例 4 与案例 5)
var obj1 = {
x:1,
getX: function () {
const inner = () => {
console.log('1:',this.x);
}
inner();
}
}
obj1.getX();
var obj2 = {
x:1,
getX() {
const inner = () => {
console.log('2:',this.x);
}
inner();
}
}
obj2.getX();
var obj3 = {
x:1,
getX: () => {
const inner = () => {
console.log('3:',this.x);
}
inner();
}
}
obj3.getX();
function a() {
this.x = 1;
function b() {
console.log('4: ', this.x);
}
b();
}
a();
var obj5 = {
x: 1,
getX() {
const inner = function() {
console.log('5: ',this.x);
}
inner();
}
}
obj5.getX();
剧透警告!!!以下是我的猜测和解释!!! 在进一步阅读之前,最好自己尝试一下。
我的理解:
案例1:由于inner是一个箭头函数,所以考虑了parent的this。因此1 是有道理的。
案例 2: 从语义上看,案例 1 和案例 2 之间没有任何区别。如果我在这里错了,请纠正我。
也就是说,{getX(){}} 与 {getX: function(){}} 应该是等价的。
案例 3: 由于 inner 和 getX 都是箭头函数,this 代表窗口范围,因此输出应为 undefined。
案例4:由于调用内部函数没有关联对象,所以this指的是父方法的this,与a的含义相同。因此,输出为 1。
案例5:由于调用内部函数没有关联对象,所以this是指父方法的this,与obj4obj5相同.因此输出应该是 1。
注意:案例 5 输出为 undefined。需要帮助理解这一点。
注意 2: 在新浏览器选项卡的控制台中,仅复制粘贴案例 5。您将看到 undefined。而如果将所有这些案例复制粘贴在一起,案例 5 的输出将为 1。
【问题讨论】:
-
"案例 4:由于调用内部函数没有关联对象,所以 this 指的是父方法的 this" - 没有。 value of
this由调用b()或a()确定,它们不传递任何上下文,因此默认为全局对象(使用严格模式!)。 -
这能回答你的问题吗? Arrow Functions and This
-
@SebastianSimon - 感谢您的评论。我在 Chrome 和 Safari 上再次尝试了不同的场景,然后在我的原始帖子中添加了注释 2。
标签: javascript closures this arrow-functions