为什么类名称在重新定义之后可以在类中引用?

see*_*con 5 javascript scope ecmascript-6 es6-class

您期望的以下内容不起作用:

let User = {
    foo() {
        User.prop = 1;
    }
};

let User2 = User;
User = null;

User2.foo();  // Cannot set property of null
console.log(User2.prop);
Run Code Online (Sandbox Code Playgroud)

但这有效:

class User {
    static foo() {
        User.prop = 1;
    }
}

let User2 = User;
User = null;

User2.foo();
console.log(User2.prop);  // 1
Run Code Online (Sandbox Code Playgroud)

由于函数和类是对象,在这两种情况下我都为它设置了一个属性,为什么结果不同?它在哪里获得User参考?

Ber*_*rgi 7

命名函数表达式类似,classes包含在一个额外的作用域中,该作用域包含带有名称和值的不可变绑定.

如果我们class忠实地将语法贬低到ES5,我们会得到类似的东西

let User = (() => {
    const User = function() {};
//  ^^^^^^^^^^
    User.foo = function() {
        User.prop = 1;
    };
    return User;
})();

let User2 = User;
User = null;

User2.foo();
console.log(User2.prop);  // 1
Run Code Online (Sandbox Code Playgroud)

这个内部User声明是该foo方法正在关闭的声明.覆盖外部变量并不重要.