【问题标题】:Does ES2015 exported class create a closure?ES2015 导出的类会创建闭包吗?
【发布时间】:2016-02-23 07:30:26
【问题描述】:

由于它目前是通过 Babel + Webpack 编译的,模块的导出类将创建一个闭包:在模块内创建的变量将在类实例之间共享。

bar.js:

let foo;

export default class Bar {
    set foo(value) {
        foo = value;
    }
    get foo() {
        return foo;
    }
}

app.js:

import Bar from './bar.js';

var barOne = new Bar();
var barTwo = new Bar();

barOne.foo = 'quux';
console.assert(barTwo.foo === 'quux');

我想知道这种行为是否符合规范。

【问题讨论】:

  • 如果你改为使用this.foo == value 会发生什么? :)
  • 在二传手中。我想说foo 是一个类(又名静态)属性,而this.foo 是一个实例属性。
  • 等等。我什至没有在那里看到let foo;。当然,这两个班级都是一样的。这个例子实际上与类无关,但与模块(exportimport)应该工作的方式有关
  • @Sergiu:它也与模块无关。
  • foo 是模块内的变量。整个模块在任何地方共享。是的,整个模块并没有在这里添加任何“魔法”。如果您在其他地方使用export fooimport,它也会是=== 'quux'

标签: javascript class module closures ecmascript-6


【解决方案1】:

我想知道这种行为是否符合规范。

是的。 JavaScript 具有词法作用域。这不会随着课程而改变。

请记住,类或多或少只是构造函数 + prototype 的语法糖。如果你写的话,你会有同样的问题吗

let foo;

function Bar(){};

Bar.prototype = {
    set foo(value) {
        foo = value;
    }
    get foo() {
        return foo;
    }
};

module.exports = Bar;

改为?

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2018-02-03
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多