【问题标题】:Is there any advantage to naming function declarations?命名函数声明有什么好处吗?
【发布时间】:2015-02-24 13:12:04
【问题描述】:

A.函数 foo( ){ }

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

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

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

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

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


【问题讨论】:

  • Yours is better。您能否将您的同事声称遵循的“airbnb 最佳实践”链接起来?
  • airbnb 不是某种租赁/预订网站吗?他们什么时候成为值得信赖的 JavaScript 最佳实践专家?
  • re AirBNB,很多人喜欢他们的综合styleguide/code conventions.
  • 很好的链接@Andy。令人惊讶的是,我在“函数”下没有看到任何支持 OP 同事的信念,即他们建议不要使用函数声明。我确实看到了一些你可以误读的东西,但这是误读。

标签: javascript function


【解决方案1】:

序言:你的称为函数声明。他被称为命名函数表达式 (NFE)。这些在this question and its answers 中进行了详细讨论,但解决了您的具体问题:

...他说这是airbnb的最佳实践...

如果他说的是these Airbnb style guidelines,我看不出有任何东西可以支持这种说法。我确实看到了一些你可能会误读的东西,但这会是误读。它说不要在控制流块内声明函数,例如:

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

确实如此,这不仅是糟糕的,而且根据当前的规范无效。您只能在范围的顶层声明函数(例如,在所有控制流结构(如 ifwhilefor 等)之外的全局范围;或在外部函数的顶层所有控制流结构)。上面的示例无效,因为它位于连接到if 的块内。 (在 ES6 中,仅适用于 Web 引擎,它是 tolerated 在一个非常具体的情况下 - TL;DR:不要这样做。)

但这不是笼统的“不要使用函数声明”,而不是远程。

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

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

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

是的,这个工作代码:

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

...如果重写为:会中断:

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

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

另外,一些浏览器获得了 NFE错误,创建了two functions instead of one。例如,IE8 和旧版本的 Safari 一样。我知道的所有现代浏览器(现在)都可以正常使用。

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

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

这是一个主观的意见问题,除了上面提出的真正问题(由于移除提升和 NFE 导致的中断)。

【讨论】:

  • 分享一些主观意见:函数声明更短,更少冗余,更有特色。
  • 所以刚刚向我透露,使用 B 的动机是为了让您可以通过以下方式链接您的函数和变量。我从来没有写过这样的代码。这是一种已知的方法吗? jsfiddle.net/s0vva8dm/1
  • @JusticeGödelConder:在您引用的示例中没有理由这样做。函数声明会更清晰,维护麻烦也更少。如果将许多函数设置为对象的属性 (jsfiddle.net/s0vva8dm/2),那么这样做是有争议的,但这不是一回事。无论如何,您也不会将函数声明放在对象初始化程序的中间;它们在那里无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2011-10-13
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多