如何处理函数声明?
var abc = '';
if (1 === 0) {
function a() {
abc = 7;
}
} else if ('a' === 'a') {
function a() {
abc = 19;
}
} else if ('foo' === 'bar') {
function a() {
abc = 'foo';
}
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'
此示例在 Chrome 和 Firefox 中产生不同的输出。 Chrome 输出 foo
而 FF 输出 19
。
最佳答案
当提出这个问题时,ECMAScript 5 (ES5) 很流行。在 ES5 的严格模式下,函数声明不能嵌套在 if
block 中,如问题中所示。在非严格模式下,结果是不可预测的。不同的浏览器和引擎针对如何处理 block 内的函数声明实现了自己的规则。
截至 2018 年,许多浏览器对 ECMAScript 2015 (ES2015) 的支持程度达到 function declarations are now allowed inside blocks .在 ES2015 环境中, block 内的函数声明将在该 block 内进行作用域。问题中的代码将导致未定义的函数错误,因为函数 a
仅在 if
语句的范围内声明,因此不存在于全局范围内。
如果你需要有条件地定义一个函数,那么你应该使用function expressions .
关于javascript - if/else 语句中的函数声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10069204/