为什么在if中定义函数是个坏主意
Why defining function inside an if is a bad idea?
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中是标准化的,并且在块内嵌套函数声明是有效的。下面是规范块级函数声明
您可以在最新的浏览器中尝试使用严格模式。至于为什么这种行为在旧环境中存在,请看这里:函数
简短的答案已经给你了,即:这种做法会对解决方案在不同浏览器之间的可移植性/兼容性产生负面影响。更糟糕的是:它导致了局部变量的模糊性,即:哪些变量对哪些嵌套函数是"可见的"。尽管它可以被认为是允许的技术,但这并不意味着这种技术是一种好的实践。"为清晰而编码"是非常重要的编程范例,所以总是尽量避免增加歧义的实践。最好的祝福,
- Javascript:If-then语句在函数中不起作用
- 避免在if condition-Javascript中使用函数
- 清除函数中if语句内部不起作用的间隔
- 将 HTML 添加到 Javascript IF 函数
- geoTest函数-创建if/else语句
- 使用usinf-if语句javascript调用函数
- 在 JavaScript IF 语句中使用匿名函数
- .has() 函数在 if 语句 (jQuery) 中不起作用
- 当if条件被添加到循环中时,Javascript函数将停止工作
- 函数中的If语句会创建其他对象
- 为什么更改范围获胜'不能在ng if内部工作,而是通过函数调用AngularJS
- 用于筛选数据的函数--if.else语句
- 正在创建嵌套的if+else-if语句,但函数返回为未定义
- 为什么我的函数if/else-if/else-if语句返回相同的答案
- Symfony 3分支模板函数if
- 税务函数(If/Else语句)的问题
- JQuery元素点击函数IF(对于每个css_attribute = value)然后改变css值
- Javascript更新函数If和Else问题
- if语句-Javascript函数if True
- Javascript函数IF语句不起作用