ES6中的默认导出。你为什么不需要分号?

时间:2015-11-02 16:27:23

标签: ecmascript-6

我正在从exploringjs about ES6

中读到这篇文章
  

17.1.2单一默认导出

     

可以有一个默认导出。例如,函数:

//------ myFunc.js ------   
export default function () { ··· } // no semicolon!

//------ main1.js ------  
import myFunc from 'myFunc';
myFunc();
     

或者是一个班级:

//------ MyClass.js ------  
export default class { ··· } // no semicolon!

//------ main2.js ------  
import MyClass from 'MyClass';
let inst = new MyClass();
     

请注意,如果您没有分号   default-export一个函数或一个类(它们是匿名的   声明)。

为什么不在导出默认声明的末尾使用分号?我以为你用半冒号结束所有陈述?

3 个答案:

答案 0 :(得分:13)

  

为什么不需要分号?

因为grammar没有在那里定义分号:

export default HoistableDeclaration
export default ClassDeclaration
export default [lookahead ∉ {function, class}] AssignmentExpression ;

(除非你有表达)

  

我以为你用半冒号结束所有陈述?

这根本不是真的。你有没有在一个街区后加一个分号?如果有人写作

if (...) {

};

然后是错误的。

似乎所有语句都以分号结束,因为在大多数语句的结尾/最后,你最终得到一个ExpressionStatement或空语句,它们都以分号结束。

除此之外, ExportDeclaration 不是声明。

答案 1 :(得分:5)

  

我以为你用半冒号结束所有陈述?

是的,但声明不是声明。这不是针对导出的,也不是在正常的函数声明后输出分号。

顺便说一句,在你没有实际需要分号的陈述中,因为JavaScript有automatic semicolon insertion - 这只是一种很好的做法。

答案 2 :(得分:2)

spec指定:

  

大多数ECMAScript语句和声明必须以a终止   分号。这些分号可能总是在源中明确显示   文本。然而,为方便起见,可以省略这样的分号   某些情况下的源文本。描述了这些情况   通过说分号自动插入源   这些情况下的代码令牌流。

所以,IMO,如果在ES6环境中,并且(特别是)如果你正在使用服务器端JavaScript,那么在明显不会产生不良影响的情况下,可以省略分号

另见this article

This是扣留分号的一个很好的例子。