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);
但这有效:
class User {
    static foo() {
        User.prop = 1;
    }
}
let User2 = User;
User = null;
User2.foo();
console.log(User2.prop);  // 1
由于函数和类是对象,在这两种情况下我都为它设置了一个属性,为什么结果不同?它在哪里获得User参考?
与命名函数表达式类似,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
这个内部User声明是该foo方法正在关闭的声明.覆盖外部变量并不重要.
| 归档时间: | 
 | 
| 查看次数: | 64 次 | 
| 最近记录: |