javascript - if/else 语句中的函数声明?

标签 javascript function scope

如何处理函数声明?

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/

相关文章:

javascript - 使用请求登录到具有 javascript 登录表单的网站

javascript - 如何选择多个输入字段并删除所需的属性?

javascript - 包装一个 jquery 函数并返回一个值

java - java中的函数作为私有(private)成员变量

javascript - 在字符串中查找模式的更好方法是什么?

JavaScript:在全局范围内定义的两个函数之间的访问

javascript - 如何将事件绑定(bind)到另一个动态创建的元素内的动态创建的元素?

javascript - Mustache - 以使用相同名称的嵌套部分为条件

c++ - 在函数内部使用裸括号是一种好习惯吗?

scope - 当声明符(我的/状态)在 for block 中时会发生什么?