如果我有
Class Car {}
我需要用函数闭包来包装它吗? var会被提升到窗口吗?还是只到班上?转换后怎么样? Traceur / babel将它变成IIFE并让我们进入var?
我需要:
(function(){
Class Car() {}
}());
安全吗?
答案 0 :(得分:2)
如此处所示,不需要为类车提供IIFE包装器,实际上这将创建一个执行上下文并将该类隐藏在页面的其余部分。
所以你只要把它留下(不是小写)
class Car(){}
Var仍以与以前相同的方式悬挂。它将被提升到执行上下文的顶部。如果代码当前在窗口的上下文中,那么var将结束。
ECMAScript 6中的类不被提升。因此该类只有在声明后才可用。
答案 1 :(得分:1)
不,只要代码被视为ES6模块,就没有必要像这样包装它。 Babel的默认设置将输入代码和文件视为模块。 Babel确实在各个地方引入了函数来实现正确的作用域语义,如果你启用了适用的变换器,它会将let
转换为var
。
ES6模块始终处于严格模式,这是规范中关于严格模式下的赋值的说法:
分配给未声明的标识符或以其他方式无法解析的引用不会在全局对象中创建属性。在严格模式代码中进行简单赋值时,其LeftHandSide不得求值为无法解析的引用。
http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript
你究竟是什么意思?:
var会被提升到班级吗?
答案 2 :(得分:1)
您可以查看Babel转换代码here
时会发生什么您不需要使用IIFE,除非您想要隐藏该类,并且生成的$('.fullscreen-button').click(function(){
$('.program-collector div.' + $(this).attr('id')).hide();
});
将作为任何变量提升:声明将在开始时进行,但是该分配将采取放在原来的行中。
是的,Babel将var Class
转变为let
,但它也需要关注范围与预期的额外设置一样。如果您只想编写ES6代码并执行它,您不必担心这些细节,只需遵循ES6(ES2015)标准。