【问题标题】:Value of a global variable redeclared in the scope of a function [duplicate]在函数范围内重新声明的全局变量的值[重复]
【发布时间】:2018-03-21 17:58:39
【问题描述】:

我的问题可能有点“学究气”,但我遇到了那段代码,我意识到我不明白为什么它返回“未定义”。通过使用 Chrome 调试器,我注意到在我们进入函数的那一刻,a 变量似乎变成了undefined。我的第一感觉是代码块会返回 2。

如果有人能解释一下这个例子,那将不胜感激

  var a = 2;
  console.log((function(condition){
       if (condition) {
          var a = 4;
          return a;
      } else {
          return a;
      }
  })(false))

如果这个问题的标题不够清楚,我让你提出更合适的建议。

【问题讨论】:

    标签: javascript scope var


    【解决方案1】:

    var 声明总是被解释为好像它是写在函数体的顶部,所以你的代码运行为

      var a = 2;
      console.log((function(condition){
           var a;
           if (condition) {
              a = 4;
              return a;
          } else {
              return a;
          }
      })(false))
    

    由于condition 为假,else 子句运行并且函数返回未初始化的a 值。局部的var声明隐藏了函数外声明的相对全局的a;它与函数的行为方式无关。

    如果您使用let 而不是var 声明本地a,情况会有所不同。 else 子句中的a 引用 引用了更​​全局的alet 声明的范围仅限于它的封闭块语句,这与 var 不同,它总是生成函数范围的变量。

    【讨论】:

    • 这是一个很好的解释!我现在很清楚了!非常感谢
    • 是否可以将“总是生成函数范围变量的 var”也称为“总是生成闭包范围变量的 var”?
    • @MarkSchultheiss 很好,这也很准确,但是对于学习语言的人来说,“函数”这个词很容易掌握,因为它就在他们面前的屏幕上,而“闭包”这个词是善良的- 含糊不清。我知道这意味着什么,但描述它需要一段时间。
    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2023-04-08
    • 2016-05-17
    • 2017-08-19
    • 2019-04-07
    • 2014-02-12
    相关资源
    最近更新 更多