为什么'这个'返回' undefined'在箭头函数中引用但在匿名函数上调用时没有?

时间:2016-10-11 21:34:41

标签: javascript node.js javascript-objects arrow-functions

我正在使用node.js v6.7.0并在声明一个对象时引用了这个'这个'它返回undefined如果它在箭头函数内,但当它在常规匿名函数内时,它返回对象本身(这就是我想要的)

例如



let obj = {
  key: 'val',
  getScopeWithArrow: () => {return this;}, //returns undefined
  getScopeWithAnonymous: function() {return this;} //returns the object properly
}




2 个答案:

答案 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());