命名函数声明有什么好处吗?

Jus*_*der 2 javascript function

A. 函数 foo( ){ }

B. var foo = 函数 foo( ){ }

我以 A 方式编写所有 JavaScript 函数,因为我认为 B 是多余的。我的同事喜欢进去做大量查找/替换来重写我的函数,比如 B,因为他说这是根据 airbnb 的最佳实践。

  1. 两者之间的基本/实际区别是什么?

  2. 他这样做有破坏我的代码的危险吗?

  3. 一种比另一种更好的做法(你能引用任何来源吗)?


T.J*_*der 5

序言:您的称为函数声明。他被称为命名函数表达式(NFE)。这些在本问题及其答案中进行了详细讨论,但要解决您的具体问题:

......他说根据airbnb,这是最佳做法......

如果他在谈论这些 Airbnb 风格指南,我看不出有什么可以支持这种说法。我确实看到一些你可能会误读的事情,但那会是误读。它说不要在控制流块内声明函数,例如:

// bad
if (currentUser) {
  function test() {
    console.log('Nope.');
  }
}
Run Code Online (Sandbox Code Playgroud)

这是真的,这不仅不好,而且根据当前的规范是无效的。您只能在作用域的顶层声明函数(例如,在所有控制流结构之外的全局作用域,如ifwhilefor等;或在所有控制流结构之外的函数的顶层)。上面的示例无效,因为它位于连接到if. (在 ES6 中,仅适用于 Web 引擎,它在非常特定的情况下可以容忍的——TL;DR:不要这样做。)

但这不是一揽子“不要使用函数声明”,而不是远程。

两者之间的基本/实际区别是什么?

在执行任何分步代码之前(有时称为“提升”),您的表单在进入函数声明的范围时被处理。他的形式稍后执行,当在逐步执行代码时遇到函数表达式。

他这样做有破坏我的代码的危险吗?

是的,这个工作代码:

foo();
function foo() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

...如果重写为:

foo(); // <== Fails
var foo = function foo() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

...因为函数声明提升消失了(var提升仍然存在),所以当您尝试调用它时foo变量具有值undefined

另外,一些浏览器将 NFE弄错了,创建了两个函数而不是一个。例如,IE8 和旧版本的 Safari 一样。我知道的所有现代浏览器(现在)都可以正确使用它们。

最后,他正在重写您的代码以依赖自动分号插入的可怕之处(要正确重写它,他需要;在函数体之后添加)。ASI 并不完美。依赖它传统上也搞砸了 minifier,尽管现在大多数 minifier 都能正确处理它(因为从技术上讲,不处理它是 minifier 中的一个错误)。

一种比另一种更好的做法(你能引用任何来源吗)?

这是一个主观的意见问题,除了上面提出的实际问题(由于移除吊装和 NFE 而损坏)。

  • 分享一些主观意见:函数声明更短,冗余更少,更有特色。 (2认同)