Javascript 为什么arrow函数不使用全局对象?
下面是我的代码:Javascript 为什么arrow函数不使用全局对象?,javascript,Javascript,下面是我的代码: let hat={ 姓名:“帽子”, 价格:“100”, writeDetails:()=> console.log(`${this.name}:${this.price}`) }; //设置全局变量 name=“全球帽子” 价格=999; hat.writeDetails()您的问题在“主要优点:不绑定‘this’”一节中描述 您可以避免使用数组函数构造: //writeDetails: () => console.log(`${this.name}: ${t
let hat={
姓名:“帽子”,
价格:“100”,
writeDetails:()=>
console.log(`${this.name}:${this.price}`)
};
//设置全局变量
name=“全球帽子”
价格=999;
hat.writeDetails()代码>您的问题在“主要优点:不绑定‘this’”一节中描述
您可以避免使用数组函数构造:
//writeDetails: () => console.log(`${this.name}: ${this.price}`)
writeDetails: function() {console.log(`${this.name}: ${this.price}`)}
箭头函数没有自己的此;它继承了它出现的位置的此
值。在您的情况下,这似乎不是全局对象
如果希望writeDetails
像hat
上的属性所建议的“普通方法”一样工作,那么它不应该是箭头函数:
let hat = {
name: "Hat",
price: "100",
writeDetails() {
console.log(`${this.name}: ${this.price}`);
},
};
然后,您可以使用hat.writeDetails.call(this)
(如果需要)执行奇怪的“global hat”操作。这是因为作用域,当声明arrow函数时,这里的作用域仅限于函数内部。
使用普通函数进行此操作。添加已给出的答案。你应该仔细阅读他们的文章
箭头函数是一种简写方法,用于声明函数并将其绑定到声明函数的范围
假设函数声明如下:
class C{
foo = () => {
console.log('foo')
}
}
大致翻译为:
class C{
foo(){
console.log('foo')
}
this.foo = this.foo.bind(this)
}
这将导致函数绑定到其声明的范围。在我的示例中,它是C类。如果在函数foo
中使用此
,它将始终指向类对象。在您的例子中,它是在函数中声明的,因此,它的作用域始终是函数本身
如果您正常声明一个函数而不绑定它,则传递给该函数的this
上下文将是从中调用它的块的上下文。假设您调用了B类
中的未绑定函数
在这种情况下,传递给函数的this
将指向类B的对象
因此,您的问题应该通过在没有绑定的情况下声明函数来解决。从任何块或类外部调用函数都将使函数继承全局作用域。箭头函数不用于替换使用函数
关键字的普通函数。更多细节
这是可行的替代方案
let hat = {
nam: "Hat",
_price: 100,
priceIncTax: 100 * 1.2,
set price(newPrice) {
this._price = newPrice;
this.priceIncTax = this._price * 1.2;
},
get price() {
return this._price;
},
writeDetails(){
console.log(`${this.nam}: ${this._price}, ${this.priceIncTax}`)}
};
hat.writeDetails();
无论您在哪里运行它,this
都不是全局对象。在代码段中,它是,所以这没有帮助。那么…你在哪里运行它?@我肯定是用node运行的,IDE是VSCode@Ry-我重新编辑了postarrow函数,该函数从定义它们的作用域继承。它并不总是全局对象。可能重复是的,这就是重点,我以前尝试过你的解决方案,但我想知道为什么它在arrow函数中起作用,但如果我重写arrow函数,它会起作用,请检查我的帖子。这并不能回答问题。@IronMan更新。