【问题标题】:ES6 Module arrow function exports don't retain their nameES6 模块箭头函数导出不保留其名称
【发布时间】: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 上的警告在这里可能会有所帮助。

标签: javascript ecmascript-6


【解决方案1】:

我刚刚尝试过,还导出了 let func123 = () => {} 它也适用于“const”和“let”。 也许是您正在使用的一些配置?你在使用 webpack 还是什么?

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 2016-09-07
    • 2022-01-21
    • 2016-03-25
    • 2017-06-03
    • 2019-04-04
    • 2018-04-05
    相关资源
    最近更新 更多