Javascript 在命名的导出函数声明后是否需要分号

Javascript 在命名的导出函数声明后是否需要分号,javascript,ecmascript-6,es6-modules,Javascript,Ecmascript 6,Es6 Modules,首先,这不是ASI的问题。我不是在问自动分号插入是否适用于这里(嗯,我有点适用,但这个开场白是为了避免我是否应该使用分号之间的争论,因为asi会为我处理分号…) 我知道不能在函数声明后加分号 function foo() { // do stuff } // no semicolon 但是在导出函数声明后是否需要分号 export function foo() { // do stuff } // semicolon or not to semicolon? 不管是哪种情况,我也想

首先,这不是ASI的问题。我不是在问自动分号插入是否适用于这里(嗯,我有点适用,但这个开场白是为了避免我是否应该使用分号之间的争论,因为asi会为我处理分号…)

我知道不能在函数声明后加分号

function foo() { 
  // do stuff
} // no semicolon
但是在导出函数声明后是否需要分号

export function foo() {
  // do stuff
} // semicolon or not to semicolon?

不管是哪种情况,我也想知道原因。

不,这里不需要分号。请参见以下示例:

另见:

语法
正如您所看到的,声明之后没有分号,您不需要分号,尽管添加一个分号不会有什么害处

如果我们查看,您将看到此签名被视为声明,并且与普通函数声明一样,它后面不需要分号:

出口申报

需要在后面加分号(无论是显式还是隐式)的语句在该文档中都有相应的注释。例如:

export*
FromClause


那里有
是必需的。在宣言中,它不是。当然,插入分号不会造成任何伤害;JS解释器会将其视为一个空语句。

是的,但这是一个
默认导出
我特别想知道
命名导出
@sfletche为什么与命名导出不同?我不知道它是否会。(这也是我问这个问题的原因之一)
export default function() {} // or 'export default class {}'
// there is no semi-colon here
ExportDeclaration :
  export * FromClause ;
  export ExportClause[~Local] FromClause ;
  export ExportClause[+Local] ;
  export VariableStatement[~Yield, ~Await]
  export Declaration[~Yield, ~Await]
  export defaultHoistableDeclaration[~Yield, ~Await, +Default]
  export defaultClassDeclaration[~Yield, ~Await, +Default]
  export default[lookahead ∉ { function, async [no LineTerminator here] function, class }]AssignmentExpression[+In, ~Yield, ~Await] ;