导出箭头函数还是基本函数?

66

哪种方式更好:像这样导出一个const箭头函数:

export const foo = () => 'bar'

或者像这样导出一个普通函数:

export function baz() {
  return 'bar';
}

它们编译的方式如下:

exports.baz = baz;
function baz() {
  return 'bar';
}
var foo = exports.foo = function foo() {
  return 'bar';
};

使用const/箭头函数组合似乎会声明一个额外的变量(foo),这似乎是在简单函数声明上多余的步骤。


1
这是将ECMAScript 6编译成ECMAScript 5,对吗? - qxz
1
这个问题假设ES6代码是通过Babel转译成ES5,但这并不一定正确。 - Estus Flask
是的,我很抱歉没有表达清楚。ES6正在通过Babel转译为ES5。 - abustamam
1个回答

62

这两者的差别微不足道。都是声明变量。

  • const 变量在模块内也是常量,而函数声明理论上可以从模块内部被覆盖。
  • 箭头函数是函数表达式,而不是函数声明,并且赋值可能会导致循环依赖的问题。
  • 箭头函数不能作为构造函数使用或使用动态的 this
  • 如果使用简洁体,则箭头函数会比块体少几个字符;如果使用块体,则会比普通函数长几个字符。
  • 函数声明更能表达可调用的意图。存储在 const 中的箭头函数可能会在其他 const 中迷失。

5
从架构的角度来讲,只要功能不需要构造函数或this,那么使用const变量就可以了。您能详细说明第二点关于循环依赖的内容吗? - abustamam
1
@MarosIvanco 关于你的编辑:函数声明不会创建常量。模块导出只能从外部进行不可变操作。 - Bergi
其他考虑因素可以考虑,例如一些模拟库可能不支持测试箭头函数是否被调用,但如果使用常规函数,则可以。例如,typemoq:对于静态模拟,TypeMoq能够验证常规函数内部的任何内部调用,但不能验证lambda函数内部的调用。例如: - ps2goat
@ps2goat,这似乎是TypeMoq库和类字段的缺陷,而不是箭头函数的缺陷。就像在使用const时无法重新分配函数表达式一样。 - Bergi

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