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更新。