Javascript 为什么;这";是否在胖箭头函数定义中未定义?

Javascript 为什么;这";是否在胖箭头函数定义中未定义?,javascript,ecmascript-6,Javascript,Ecmascript 6,首先我试过这个- const profile = { name: 'Alex', getName: function(){ return this.name; } }; 这很好用。现在我用胖箭做了同样的尝试。在这种情况下,“this”是未定义的 const profile = { name: 'Alex', getName: () => { return this.name; } }; 这给了我一个错误 TypeE

首先我试过这个-

const profile = {
    name: 'Alex',
    getName: function(){
      return this.name;
    }
};
这很好用。现在我用胖箭做了同样的尝试。在这种情况下,“this”是未定义的

const profile = {
    name: 'Alex',
    getName: () => {
      return this.name;
    }
};
这给了我一个错误

TypeError:无法读取未定义的属性“name”


我学到的是,胖箭头语法更好地处理隐含的“this”。请解释发生这种情况的原因。

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

这意味着每当在箭头函数中引用
this
时,它将开始查找范围以查找
this
的值,或者在这种情况下,在查找过程中发现
对象本身没有
this
,因此,它进入全局范围,并将
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
行为


是的,这个问题确实回答了这个问题:也是
obj.foo()的副本将打印
未定义的
,而不是
全局
.yes,因为“global!!!”打印在console语句中。我想补充一点,因为
let
不会在全局对象上创建属性,如果第一个示例中
a
声明为
let a='global!!!'。然后结果将是
未定义
@Suvitruf andriapanasik您确定要在浏览器中或使用
Node.js
在命令行中运行代码吗
Node.js
没有窗口对象,可能这就是结果
未定义的原因。或者可能
a
是用
let
声明的,我在另一条评论中解释了原因。