【发布时间】:2017-10-20 20:41:03
【问题描述】:
为什么导出的箭头函数不保留它们的名称,有没有办法让它们这样做?
给出一个如下的 ES6 模块:
myModule.js
export function doSomeWork1() {
}
export const doSomeWork2 = () => {
};
如果我然后将它们导入另一个文件,这样导出的函数会保留其名称,而箭头函数则不会。
example.js
import { doSomeWork1, doSomeWork2 } from './myModule';
console.log('doSomeWork1...');
console.log(doSomeWork1);
console.log(doSomeWork1.name); // name is retained
console.log('doSomeWork2...');
console.log(doSomeWork2);
console.log(doSomeWork2.name); // name is NOT retained
输出:
doSomeWork1...
[Function: doSomeWork1]
doSomeWork1
doSomeWork2...
[Function]
如果我要在 ES6 模块中声明一个箭头函数而不将其导出并直接在该文件中打印出来,它会保留它的名称。
myModule.js
const doSomeWork3 = () => {
};
console.log('doSomeWork3...');
console.log(doSomeWork3);
console.log(doSomeWork3.name); // name is retained
输出:
doSomeWork3...
[Function: doSomeWork3]
doSomeWork3
【问题讨论】:
-
这可能是引擎中的错误(或尚不支持的行为)。
export const应单独使用与const相同的行为,即 is defined to give names to anonymous functions(参见LexicalBinding : BindingIdentifier Initializer下的步骤 5)。 -
乔纳森是对的。
console.log(doSomeWork3.name)在 Chromium 中有效,但在 Firefox 中无效(您会得到一个空字符串)。 -
这是在节点 6.9.2(服务器端)中。我正在使用 babel.js 使用“babel-plugin-transform-es2015-modules-commonjs”包将 ES6 模块转换为 common.js 格式。也许是罪魁祸首?
-
Babel 无法做到这一点,除非你也将箭头函数转换为函数表达式。
-
JavaScript 压缩器和压缩器 部分中MDN 上的警告在这里可能会有所帮助。