我正在尝试ES6,并希望像这样在我的函数中包含一个属性
var person = {
name: "jason",
shout: () => console.log("my name is ", this.name)
}
person.shout() // Should print out my name is jason
但是,当我运行此代码控制台时,仅显示log my name is
。我究竟做错了什么?
简短的答案:this
指向最接近的边界this
-所提供的代码this
位于封闭范围内。
更长的答案:箭头功能
没有this
创建它们时将其绑定
this
,arguments
或结合其它特殊名字都正在创建对象时的名称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;
在这两种情况下,this
(对于shout函数)都指向与其中person
定义的作用域相同的函数,而不是将函数添加到person
对象时附加的新作用域。
您 不能
使箭头函数那样工作,但是,正如@kamituel在他的答案中指出的那样,您可以利用ES6中较短的方法声明模式来节省相似的空间:
var person = {
name: "Jason",
// ES6 "method" declaration - leave off the ":" and the "function"
shout() {
console.log("Hi, my name is", this.name);
}
};