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
声明的,我在另一条评论中解释了原因。