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

Is there any advantage to naming function declarations?

本文关键字:什么 函数 声明      更新时间:2024-04-14

A。函数foo(){}

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

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

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

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

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


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

据airbnb报道,他说这是最好的做法。。。

如果他在谈论这些Airbnb风格的指导方针,我看不出有什么支持这一说法的。我确实看到了一些你可以这样误读的东西,但这将是误读。它说不要在控制流块内声明功能,例如:

// bad
if (currentUser) {
  function test() {
    console.log('Nope.');
  }
}

这是真的,这不仅不好,根据当前规范,它是无效的。只能在作用域的顶层声明函数(例如,在所有控制流结构(如ifwhilefor等)之外的全局作用域;或者在所有控制流程结构之外的函数的顶层声明)。上面的例子是无效的,因为它在连接到if的块内(在ES6中,仅针对web引擎,在非常特定的情况子集中可以容忍TL;DR:不要这样做。)

但这并不是一个笼统的"不要使用函数声明",不是远程的。

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

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

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

是的,这个工作代码:

foo();
function foo() {
    // ...
}

如果重写为:,则会中断

foo(); // <== Fails
var foo = function foo() {
    // ...
}

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

另外,一些浏览器错误地得到了NFE,创建了两个函数而不是一个。例如,IE8和旧版本的Safari一样。我所知道的所有现代浏览器都能正确使用。

最后,他正在重写您的代码,以依赖于"自动分号插入"这一恐怖功能(要正确地重写它,他需要在函数体后面添加;)。ASI并不完美。依赖它传统上也会弄乱迷你人,尽管现在大多数迷你人都能正确处理它(因为从技术上讲,不处理它是迷你人中的一个错误)。

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

这是一个主观的意见问题,而不是上面提出的真正问题(由于拆除吊装和NFE而断裂)。