在函数范围内重新声明的全局变量的值

时间:2018-03-21 17:58:39

标签: javascript scope var

我的问题可能是一点点" schoolish"但我落在那段代码上,我意识到我并不理解为什么它会返回" undefined"。通过使用Chrome调试器,我注意到a变量在我们进入函数时似乎变为undefined。我的第一感觉是代码块会返回2。

如果有人能对这个例子有所了解,那将非常感激

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

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

1 个答案:

答案 0 :(得分:1)

var声明始终被解释为它被写在函数体的顶部,因此您的代码将作为

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

由于condition为false,因此else子句运行,函数返回未初始化的a值。本地var声明隐藏了在函数外声明的相对全局a;它不会影响函数的运行方式。

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