为什么在if中定义函数是个坏主意

Why defining function inside an if is a bad idea?

本文关键字:函数 if 定义 为什么      更新时间:2023-09-26

From Eloquent Javascript by Marijn Haverbeke

不同的JavaScript平台在不同的浏览器有传统上在这种情况下会做不同的事情,而最近标准是禁止的。

但是为什么它不好呢?

function example () {
    function a () {} // Okay
    if ( something ) {
       function b () {} // Danger !
    }
}

它被认为是"坏的",因为它的行为不一致,有时不像大多数人期望的那样。考虑下面的代码片段:

if (true) {
    function f() { return "t"; }
} else {
    function f() { return "f"; }
}

调用f()会返回什么?在IE和Firefox上,它将返回"t",但在Chrome和Safari上,它将返回"f"。为什么?提升和JavaScript的作用域规则的组合。有关其工作原理的信息,请参阅关于JavaScript作用域和提升的问题。

实际上,这意味着,在某些浏览器上,当涉及到使用function name() { ... }形式的函数定义时,分支完全被忽略。如果你真的需要做这样的事情(你可能不需要,因为它将是非常糟糕的风格,无论如何),使用name = function () { ... }表单代替,因为它不会被提升,所以行为是良好定义的,并且不会跨平台不一致。

这在ES6中是标准化的,并且在块内嵌套函数声明是有效的。下面是规范块级函数声明

您可以在最新的浏览器中尝试使用严格模式。至于为什么这种行为在旧环境中存在,请看这里:函数

简短的答案已经给你了,即:这种做法会对解决方案在不同浏览器之间的可移植性/兼容性产生负面影响。更糟糕的是:它导致了局部变量的模糊性,即:哪些变量对哪些嵌套函数是"可见的"。尽管它可以被认为是允许的技术,但这并不意味着这种技术是一种好的实践。"为清晰而编码"是非常重要的编程范例,所以总是尽量避免增加歧义的实践。最好的祝福,