为什么在胖箭头函数定义中未定义“this”?

IT技术 javascript ecmascript-6
2021-01-24 17:13:44

首先我试过这个 -

const profile = {
    name: 'Alex',
    getName: function(){
      return this.name;
    }
};

哪个工作正常。现在我用胖箭头尝试了同样的事情。在这种情况下,“this”将是未定义的。

const profile = {
    name: 'Alex',
    getName: () => {
      return this.name;
    }
};

这给了我一个错误

类型错误:无法读取未定义的属性“名称”

我学到的是,粗箭头语法可以更好地处理隐式“this”。请解释为什么会发生这种情况。

1个回答

与常规函数不同,Arrow 函数没有this自己的 a,只有常规函数和全局作用域有this自己的。

这意味着无论何时this在箭头函数中被引用,它都会开始查找范围以找到 的值this,或者在这种情况下,在查找过程中它发现object没有this自己的 a,因此,它上升了到全局范围并将值绑定到this全局范围,在那里它找不到任何东西。这两个例子会解开你的疑惑。

var obj = {
    a : 'object???',
    foo : () => { console.log(this.a) }
};

var a = 'global!!!';

obj.foo();              // global!!!

在函数内包装箭头

var obj = {
    a : 'object???',
    foo : function() {
        return (() => {
            console.log(this.a)
        })();
    }
};

var a = 'global!!!';

obj.foo();

在这里,我试图this深入解释for arrow的行为

https://github.com/anirudh-modi/JS-essentials/blob/master/ES2015/Functions/Arrow%20functions.md#how-this-is-different-for-arrow-functions

obj.foo();会打印undefined,不会global!!!
2021-03-17 17:13:44
是的,因为“全球!!!” 打印在控制台语句中
2021-03-23 17:13:44
我想补充一点,因为let不会在全局对象上创建属性,如果a在第一个示例中声明为let a = 'global!!!'. 那么结果将是undefined
2021-03-31 17:13:44
@Suvitruf-AndreiApanasik 你确定你在浏览器或命令行中运行代码Node.js吗?. Node.js没有 window 对象,也许这就是结果是undefined. 或者也许a是声明的let,我在其他评论中解释了原因。
2021-04-03 17:13:44