Javascript Arrow函数和这个

Javascript Arrow函数和这个,javascript,this,ecmascript-6,arrow-functions,Javascript,This,Ecmascript 6,Arrow Functions,我正在试用ES6,希望在我的函数中包含这样一个属性 var person = { name: "jason", shout: () => console.log("my name is ", this.name) } person.shout() // Should print out my name is jason 但是,当我运行此代码控制台时,只记录我的名字是。我做错了什么?简短回答:此指向最近的边界此-在提供的代码中此位于封闭范围内 更详细的回答:箭头函数在创建时绑定

我正在试用ES6,希望在我的函数中包含这样一个属性

var person = {
  name: "jason",

  shout: () => console.log("my name is ", this.name)
}

person.shout() // Should print out my name is jason

但是,当我运行此代码控制台时,只记录
我的名字是
。我做错了什么?

简短回答:
指向最近的边界
-在提供的代码中
位于封闭范围内

更详细的回答:箭头函数在创建时绑定它们的
this
——当创建对象时,名称
this
位于封闭范围内,而不是
person
对象。通过移动声明,您可以更清楚地看到这一点:

var person = {
  name: "Jason"
};
person.shout = () => console.log("Hi, my name is", this);
当翻译成ES5中箭头语法的模糊近似值时,更清楚:

var person = {
  name: "Jason"
};
var shout = function() {
  console.log("Hi, my name is", this.name);
}.bind(this);
person.shout = shout;
在这两种情况下,
(对于shout函数)指向与中定义的
人员
相同的范围,而不是将函数添加到
人员
对象时附加到的新范围

您不能让arrow函数以这种方式工作,但正如@kamituel在中指出的那样,您可以利用ES6中较短的方法声明模式来节省类似的空间:

var person = {
  name: "Jason",
  // ES6 "method" declaration - leave off the ":" and the "function"
  shout() {
    console.log("Hi, my name is", this.name);
  }
};

这里,函数内部的值由定义箭头函数的位置决定,而不是由使用箭头函数的位置决定


因此,
指的是全局/窗口对象,如果未包装在与@Sean Vieira一致同意的其他命名空间中

——在本例中,
绑定到全局对象(或者,如注释中所指出的,更一般地说,绑定到一个封闭范围)

如果您想使用更短的语法,还有另一个选项-增强的对象文字支持属性函数的短语法<代码>此将按您预期的那样绑定。请参见
shout3()

问题是()

箭头函数表达式[…]在词汇上绑定此值

箭头函数捕获封闭上下文的此值

因此,该函数中
this
的值将是创建对象文本的
this
的值。很可能,在非严格模式下是
窗口
,在严格模式下是
未定义的

要修复此问题,应使用普通函数:

var person = {
  name: "jason",
  shout: function(){ console.log("my name is ", this.name) }
}
person.shout();

公认的答案是优秀的、简洁的和清晰的,但我将详细阐述肖恩·维埃拉所说的:

箭头函数没有 此参数或其他特殊名称完全没有绑定

因为arrow函数没有“this”,所以它使用父函数的“this”。“this”始终指向父对象,并且person对象的父对象是Window(如果您在浏览器中)

要证明这一点,请在控制台中运行:

var person = {
    name: "Jason",
    anotherKey: this
}
console.log(person.anotherKey)
您将获得窗口对象


我觉得这是一个非常有用的思考方式。这并不是全部内容,因为对象文字的“this”是另一个讨论。

在本例中,this
是窗口。向上投票,但注意
这不一定是全局对象。@Oriol true,注意-我假设这是顶级代码。谢谢箭头函数被称为lambda expressionsgetify link死了,可以在brilliant上查看-我试图理解为什么它会发生这么多时间!!!!解释得很清楚。谢谢
var person = {
    name: "Jason",
    anotherKey: this
}
console.log(person.anotherKey)