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

Do I need a semicolon after a named export function declaration

首先,这不是关于 ASI 的问题。我不是在问自动分号插入是否适用于此(好吧,我是这样的,但开场白试图避免在我是否应该使用分号之间争论,因为 asi 会处理它我...)

我知道函数声明后不要加分号...

function foo() { 
  // do stuff
} // no semicolon

但是 export 函数声明后需要分号吗?

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

无论哪种情况,我也很想知道为什么。

不,这里不需要分号。请参阅 MDN 中的示例:

export default function() {} // or 'export default class {}'
// there is no semi-colon here

另见 the ECMAScript specification:

Syntax

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] ;

如您所见,Declaration 后没有分号。

不,您不需要分号,尽管添加分号也没什么坏处。

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

export Declaration

需要后跟分号(无论是显式还是隐式)的语句在该文档中已注明。例如:

export * FromClause ;

其中 ; 是强制性的。在声明中,它不是。当然,插入分号不会有任何坏处; JS 解释器会将其视为空语句。