2015-10-06 72 views
6

如果我有ECMAScript/Javascript 6中的课程是否需要IIFE?

Class Car {} 

我需要来包装我们的功能关闭?瓦尔的窗户被吊起来了吗?或只是为了课堂?什么时候运输? Traceur/babel将它变成IIFE并让我们进入var's?

我需要:

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

为了安全吗?

+1

这取决于您将文件作为脚本还是作为模块加载。你如何加载文件? – loganfsmyth

+0

本地化,这是一个非常好的问题。使用Edge进行测试,虽然我可以使用该类声明的'car.js'文件和使用该类的'new-car.js'文件,但是如果我将'Car'记录到控制台中,它会向我显示构造函数,但如果我登录'window.Car',它显示'未定义'。 – Buzinas

+0

@Buzinas:这有点不同。词法声明('class','let'和'const')不会成为全局对象的属性。 –

回答

1

你可以看看会发生什么时,巴贝尔transpiles代码here

你并不需要使用IIFE,除非你要隐藏的类,并获取生成的var Class悬挂为任何变量:声明将在开始时发生,但分配将发生在原始行中。

是的,巴别尔将let变成var,但它也照顾范围的工程与预期的额外asignements预期。如果您只想编写ES6代码并执行它,则不必担心这些细节,只需遵循ES6(ES2015)标准即可。

1

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

ES6模块总是严格模式,这里就是规范说,关于分配在严格模式:

分配到一个未声明的标识符或以其他方式无法解决的引用不创建全局对象的属性。在严格模式代码中发生简单分配时,其LeftHandSide不能评估为无法解析的引用。

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

究竟你的意思是什么?:通过

做无功的得到提升到[...]类?

2

如此处所示,不需要为类汽车提供IIFE包装,事实上,它将创建一个执行上下文并隐藏该页面的其余部分。

所以你只是把它作为(不是小写)

class Car(){} 

瓦尔被以同样的方式是之前仍然悬挂。它会被吊到执行上下文的顶部。如果代码当前位于窗口的上下文中,那么var就会结束。

类是而不是在ECMAScript 6中悬挂。所以该类只有在声明后才可用。

+0

类获得悬挂,这意味着*绑定*创建时进入范围,但它没有初始化。它表现得像'let'。 –

+0

@FelixKling - 这就是它在MDN上所说的。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes“函数声明和类声明之间的一个重要区别是函数声明是悬而未决的,类声明不是。”我误解了吗?这似乎相当直接。 –

+0

Mmh,我指的是在http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation,第35步中写的内容。但是我猜“提升”的含义与我的想法不同(也许?)。类和'let'声明绝对不被认为是规范中的HoistableDeclaration,所以我想我错了。然而,即使规范似乎没有明确描述“提升”这个词。 –