node.js:导出普通函数还是箭头函数?

Hem*_*ari 1 node.js ecmascript-5 ecmascript-6 arrow-functions

我正在尝试使用普通函数或箭头函数导出 .js 文件中的函数。但我不明白哪个是推荐的。

导出正常功能

module.exports = function(id) {
   console.log(id);
};
Run Code Online (Sandbox Code Playgroud)

导出箭头函数

const test = id => {
  console.log(id);
}
module.exports = test;
Run Code Online (Sandbox Code Playgroud)

以下是我心中的几个问题。

  1. 如果推荐普通函数而不是箭头函数,那为什么不推荐我使用箭头函数。

  2. 如果箭头函数比普通函数更推荐,那为什么不推荐我使用普通函数。

我怎么理解推荐的,尤其是在这种导出函数的场景中?

Est*_*ask 8

这两个片段并不相同。第一个片段生成匿名函数,而第二个片段生成命名函数require('...').name === 'test'(这可能对调试有用)。

更合适的比较是

module.exports = function test(id) {
   console.log(id);
};
Run Code Online (Sandbox Code Playgroud)

对比

const test = id => {
  console.log(id);
}
module.exports = test;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这些箭头和常规函数之间没有区别,因为它们不使用特定于它们的功能(例如this上下文)。

匿名箭头函数需要输入更少的字符,但是当需要通过临时test变量为函数命名时,这种好处就消失了。它们还可能导致更少的内存占用,尽管可以忽略此问题,因为差异可以忽略不计。

此外,如果将命名箭头函数转换为 ES5 ,命名箭头函数会产生比常规函数定义更冗长的输出:

const test = () => {} 
Run Code Online (Sandbox Code Playgroud)

被转译为

var test = function test() {}
Run Code Online (Sandbox Code Playgroud)

虽然它可能是:

function test() {}
Run Code Online (Sandbox Code Playgroud)

这不是 Node.js 或其他 ES6 环境的问题。


TL;DR:如果一个函数需要有一个用于调试或其他目的的名称,那么使用:

module.exports = function test(id) {
   console.log(id);
};
Run Code Online (Sandbox Code Playgroud)

如果函数不需要名称,则为:

module.exports = id => {
  console.log(id);
};
Run Code Online (Sandbox Code Playgroud)

对于不使用特定于这些函数类型的特性的函数来说,这是正确的。