在 ECMAScript / Javascript 6 中 class 附近是否需要 IIFE?

Is an IIFE required around class in ECMAScript / Javascript 6?

如果我有

Class Car {}

我需要用我们的函数闭包来包装它吗? var 是否被提升到 window?或者只是到 class?转译时呢? Traceur/babel 是否将其转换为 IIFE 并让我们转换为 var?

我需要:

(function(){ 
    Class Car() {}
}());

为了安全?

不,只要它在被视为 ES6 模块的代码中,就没有必要像这样包装它。 Babel 的默认设置将输入代码和文件视为模块。 Babel 确实在各个地方引入了函数来实现正确的作用域语义,并且如果启用了适用的转换器,它会将 let 转换为 var

ES6 模块始终处于严格模式,以下是规范中关于严格模式下赋值的内容:

Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference.

http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript

你到底是什么意思?:

Do var's get hoisted to [...] the class?

你可以看看当 Babel 转译你的代码时会发生什么 here

你不需要使用 IIFE,除非你想隐藏 class,并且生成的 var Class 被提升为任何变量:声明将在开始时进行, 但分配将在原始行中进行。

是的,Babel 将 let 变成了 var,但它还通过额外的分配来确保作用域的正常工作。如果你只想编写 ES6 代码并执行它,你不必担心这些细节,只需遵循 ES6 (ES2015) 标准即可。

class 汽车不需要 IIFE 包装器,如此处所示,事实上,这将创建一个执行上下文并从页面的其余部分隐藏 class。

所以您只需将其保留为(不是小写)

class Car(){}

Var 仍然以与之前相同的方式被提升。它将被提升到执行上下文的顶部。如果代码当前在 window 的上下文中,那么这就是 var 结束的地方。

not 在 ECMAScript 6 中提升。因此 class 只有在声明后才可用。