我正在使用node.js v6.7.0并在声明一个对象时引用了这个'这个'它返回undefined如果它在箭头函数内,但当它在常规匿名函数内时,它返回对象本身(这就是我想要的)
例如
let obj = {
key: 'val',
getScopeWithArrow: () => {return this;}, //returns undefined
getScopeWithAnonymous: function() {return this;} //returns the object properly
}

答案 0 :(得分:5)
由于箭头功能没有自己的this
,因此关闭调用上下文的this
。但是非箭头函数,如果它们没有被约束,则基于它们被称为的方式取this
。我假设你正在调用这些函数:
obj.getScopeWithArrow();
obj.getScopeWithAnonymous();
在第一种情况下,箭头函数再次没有得到它自己的this
所以你如何调用它并不重要。在第二种情况下,确实很重要,并且调用它会使调用中的this
引用obj
引用的同一个对象。
另外:在您的示例中,您必须处于严格模式,因为this
在严格模式下只能是undefined
。
另外2:关于你的方法名称:this
和“范围”彼此之间几乎没有什么关系。
一些例子:
function showThis(label, t) {
if (t === window) {
console.log(label, "(global object)");
} else {
console.log(label, t);
}
}
// Loose mode by default in a non-module script element
let obj = {
arrow: () => {
showThis("arrow says ", this);
},
normal: function() {
showThis("normal says ", this);
}
};
obj.arrow(); // global object (window on browsers)
obj.normal(); // obj
function foo() {
// Here, we're in strict mode
"use strict";
let obj = {
arrow: () => {
showThis("arrow says ", this);
},
normal: function() {
showThis("normal says ", this);
}
};
obj.arrow(); // undefined
obj.normal(); // obj
}
foo();
答案 1 :(得分:0)
根据developer.mozilla.org(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)
没有绑定
在箭头函数之前,每个新函数都定义了它自己的这个值(在构造函数的情况下是一个新对象,在严格模式函数调用中是未定义的,如果函数被称为“对象方法”则是上下文对象,等等) 。事实证明,这是一种面向对象的编程风格。
<强> BUT 强>
如果目标是避免编写函数,则可以避免使用冒号并使用新的ECMA6对象函数声明语法声明方法。
let obj = {
key: 'val',
getScopeWithParens() {return this;}, //returns object
getScopeWithAnonymous: function() {return this;} //returns the object properly
}
console.log(obj.getScopeWithAnonymous());
console.log(obj.getScopeWithParens());