Jus*_*der 2 javascript function
A. 函数 foo( ){ }
B. var foo = 函数 foo( ){ }
我以 A 方式编写所有 JavaScript 函数,因为我认为 B 是多余的。我的同事喜欢进去做大量查找/替换来重写我的函数,比如 B,因为他说这是根据 airbnb 的最佳实践。
两者之间的基本/实际区别是什么?
他这样做有破坏我的代码的危险吗?
一种比另一种更好的做法(你能引用任何来源吗)?
序言:您的称为函数声明。他被称为命名函数表达式(NFE)。这些在本问题及其答案中进行了详细讨论,但要解决您的具体问题:
......他说根据airbnb,这是最佳做法......
如果他在谈论这些 Airbnb 风格指南,我看不出有什么可以支持这种说法。我确实看到一些你可能会误读的事情,但那会是误读。它说不要在控制流块内声明函数,例如:
// bad
if (currentUser) {
function test() {
console.log('Nope.');
}
}
Run Code Online (Sandbox Code Playgroud)
这是真的,这不仅不好,而且根据当前的规范是无效的。您只能在作用域的顶层声明函数(例如,在所有控制流结构之外的全局作用域,如if、while、for等;或在所有控制流结构之外的函数的顶层)。上面的示例无效,因为它位于连接到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 而损坏)。
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |