1

我只是想知道如何正确编写 ES6 函数。我知道这取决于个人喜好,但优缺点是什么?

function foo() {
  ...
}

对比

const foo = () => {
  ...
};

对比

const foo = function () {
  ...
};

对比

const foo = function bar() {
  ...
};

airbnb 风格指南推荐后者。但对我来说,为一个函数定义两个名称是没有意义的。

4

2 回答 2

3

使用函数声明意味着您将处理函数声明提升,其中所有函数在任何代码执行之前都被处理,因此您可以在定义它们之前从技术上使用它们,因为它们被提升到顶部,并且您不会有块作用域,因为它们将是函数作用域:

foo(); //can be used before declaration appears!

function foo() {
  { //new block
    function bar() { 
      alert(1);
    }
  }
  bar(); //no problem, is function scoped
}
foo(); //alerts 1!

使用函数表达式,将不会有提升,如果您使用letor ,您将拥有块范围const

function foo() {
  { //new block
    const bar = () => { 
      alert(1);
    }
  }
  bar(); //ReferenceError: Can't find variable: bar
}
foo();

最后,使用命名函数表达式允许错误为函数提供命名,而不仅仅是一个匿名函数,以便更好地调试。因此:更喜欢最后的选择。它具有预期的块作用域,(它仍然具有提升,但在代码中声明之前访问它是无效的),并且它允许更好的调试体验。

另外,不要忘记箭头函数不绑定自己的this,而是采用this封闭上下文的 !函数声明总是this引用全局对象windowundefined在严格模式下。

于 2017-07-04T07:39:03.617 回答
0

第一个具有避免与 do 相关的错误的优点hoisting,因此您可以在声明之前使用该函数。

对于其他选项,您只能在声明之后使用它们,因为在此之前,它们是具有未定义值的变量(由于提升)。所以我会说第一种选择是最安全的。

于 2017-07-04T07:35:39.227 回答