我只是想知道如何正确编写 ES6 函数。我知道这取决于个人喜好,但优缺点是什么?
function foo() {
...
}
对比
const foo = () => {
...
};
对比
const foo = function () {
...
};
对比
const foo = function bar() {
...
};
airbnb 风格指南推荐后者。但对我来说,为一个函数定义两个名称是没有意义的。
我只是想知道如何正确编写 ES6 函数。我知道这取决于个人喜好,但优缺点是什么?
function foo() {
...
}
对比
const foo = () => {
...
};
对比
const foo = function () {
...
};
对比
const foo = function bar() {
...
};
airbnb 风格指南推荐后者。但对我来说,为一个函数定义两个名称是没有意义的。
使用函数声明意味着您将处理函数声明提升,其中所有函数在任何代码执行之前都被处理,因此您可以在定义它们之前从技术上使用它们,因为它们被提升到顶部,并且您不会有块作用域,因为它们将是函数作用域:
foo(); //can be used before declaration appears!
function foo() {
{ //new block
function bar() {
alert(1);
}
}
bar(); //no problem, is function scoped
}
foo(); //alerts 1!
使用函数表达式,将不会有提升,如果您使用let
or ,您将拥有块范围const
:
function foo() {
{ //new block
const bar = () => {
alert(1);
}
}
bar(); //ReferenceError: Can't find variable: bar
}
foo();
最后,使用命名函数表达式允许错误为函数提供命名,而不仅仅是一个匿名函数,以便更好地调试。因此:更喜欢最后的选择。它具有预期的块作用域,(它仍然具有提升,但在代码中声明之前访问它是无效的),并且它允许更好的调试体验。
另外,不要忘记箭头函数不绑定自己的this
,而是采用this
封闭上下文的 !函数声明总是this
引用全局对象window
或undefined
在严格模式下。
第一个具有避免与 do 相关的错误的优点hoisting
,因此您可以在声明之前使用该函数。
对于其他选项,您只能在声明之后使用它们,因为在此之前,它们是具有未定义值的变量(由于提升)。所以我会说第一种选择是最安全的。