来自Marijn Haverbeke的Eloquent Javascript
不同浏览器中的不同JavaScript平台都有 传统上在那种情况下做了不同的事情,而且是最新的 标准实际上禁止它。
但为什么不好?
function example () {
function a () {} // Okay
if ( something ) {
function b () {} // Danger !
}
}
答案 0 :(得分:3)
它被认为是“糟糕的”,因为它的行为是不一致的,有时并不能达到大多数人的期望。请考虑以下代码段:
if (true) {
function f() { return "t"; }
} else {
function f() { return "f"; }
}
什么会调用f()
返回?在IE和Firefox上,它将返回"t"
,但在Chrome和Safari上,它将返回"f"
。为什么?提升和JavaScript的范围规则的组合。有关其工作原理的信息,请参阅this question on JavaScript scoping and hoisting。
实际上,这意味着,在某些浏览器中,当使用function name() { ... }
表单进行函数定义时,分支将被完全忽略。如果你真的需要做这样的事情(你可能不这样做,因为它的风格非常糟糕,无论如何),请使用name = function () { ... }
形式,因为这不会被提升,所以行为很好-defined并且不会跨平台不一致。
答案 1 :(得分:0)
已经给出了简短的答案,即:这种做法会对各种浏览器之间的解决方案的可移植性/兼容性产生负面影响。更糟糕的是:它导致了局部变量的模糊性增加,即:哪些变量将是"可见"嵌套函数。即使它可以被认为是允许的技术,但它并不意味着这种技术是一种很好的做法。 "代码为清晰度"是完全重要的编程范式,所以总是尝试避免增加歧义的做法。最好的问候,
答案 2 :(得分:0)
这在ES6中是标准化的,并且对于在块内嵌套函数声明是有效的。这是规范 Block-Level-Function-Declarations
您可以在启用了严格模式的最新浏览器中尝试。 有关在旧环境中存在此行为的原因,请查看此处: Functions