ES2015 exported class 是否创建闭包?

Does ES2015 exported class create a closure?

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

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');

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

I wonder if this behavour correct according to the spec.

是的。 JavaScript 有词法作用域。这不会随着 类.

而改变

请记住,类 或多或少只是构造函数 + prototype 的语法糖。如果你写

,你会不会有同样的问题
let foo;

function Bar(){};

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

module.exports = Bar;

代替?