ES6模块箭头函数导出不会保留它们的名称。

6
为什么导出的箭头函数不保留它们的名称,有没有办法让它们保留名称?
给出一个像下面这样的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

1
这可能是引擎中的一个错误(或尚未支持的行为)。export const应该使用与单独使用const相同的行为,其被定义为给匿名函数命名(请参见*LexicalBinding:BindingIdentifier Initializer*下的第5步)。 - Jonathan Lonowski
乔纳森是正确的。在Chromium中,console.log(doSomeWork3.name)是可以工作的,但在Firefox中不行(你会得到一个空字符串)。 - Badacadabra
这是在 Node 6.9.2(服务器端)中。我正在使用 babel.js 将 ES6 模块转换为 common.js 格式,使用 'babel-plugin-transform-es2015-modules-commonjs' 包进行转译。也许它是罪魁祸首? - TugboatCaptain
除非您还将箭头函数转换为函数表达式,否则Babel无法完成此操作。 - loganfsmyth
这里的MDN中的警告,在_JavaScript压缩器和缩小器_部分可能会有所帮助。 - maazadeeb
我认为这里已经涵盖了所有内容:如何在ES2015中编写命名箭头函数? - jfriend00
1个回答

1

我刚试了一下,导出 "let func123 = () => {}" 对于 "const" 和 "let" 都可以工作。 也许是你正在使用的某些配置?你在使用 webpack 或其他东西吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接