Javascript Arrow函数和这个
我正在试用ES6,希望在我的函数中包含这样一个属性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 但是,当我运行此代码控制台时,只记录我的名字是。我做错了什么?简短回答:此指向最近的边界此-在提供的代码中此位于封闭范围内 更详细的回答:箭头函数在创建时绑定
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)