默认导出后的分号

Semicolon after default export

我读到 here 我不需要在默认导出后放置分号。所以这个程序有一个不必要的分号:

export default function() {};

但是如果我的模块继续这样:

export default function() {};

(() => {
  // creating a new function scope
})();

那分号就不能留了

那么这是怎么回事?语法上说我不需要分号,但如果我不加分号,代码还有别的意思吗?

更新:

如果我离开分号:

export default function() {}

(() => {
  // creating a new function scope
})();

然后调用导出的函数而不是导出。 babeljs.io将后者编译成:

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = (function () {})(function () {
  // creating a new function scope
})();

;
module.exports = exports["default"];

更准确地说,在它被调用后会抛出错误,因为第一个函数的 return 值也被调用(但那不是函数)。我在 chrome 中得到的错误是:

Uncaught TypeError: (intermediate value)(...) is not a function(…)

export default 后跟函数声明时,您不需要在 export default 后添加分号,这就是 grammar 的意思。

Babel 是错误的,我 filed a bug 反对它。该代码应解释为导出函数,然后 运行 IIFE 作为 IIFE。