Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数范围内重新声明的全局变量的值_Javascript_Scope_Var - Fatal编程技术网

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

Javascript 在函数范围内重新声明的全局变量的值,javascript,scope,var,Javascript,Scope,Var,我的问题可能有点“学校化”,但我偶然发现了这段代码,我意识到我不明白为什么它返回“未定义”。通过使用Chrome调试器,我注意到a变量在我们进入函数时似乎变成了undefined。我的第一感觉是代码块将返回2 如果有人能解释一下这个例子,我们将不胜感激 var a = 2; console.log((function(condition){ if (condition) { var a = 4; return a; } e

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

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

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

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

一个
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
;它在函数的行为方式中不起作用


如果您使用
let
而不是
var
声明本地
a
,情况会有所不同。
else
子句中的
a
引用将引用更全局的
a
let
声明的作用域是它的封闭块语句,不像
var
总是使用函数作用域变量。

这是一个很好的解释!我现在明白了!非常感谢“总是产生函数作用域变量的var”也被称为“总是产生闭包作用域变量的var”@markschultheis这也很准确,但是对于学习这种语言的人来说,“函数”一词很容易理解,因为它在屏幕上,而“闭包”一词有点模糊。我知道这意味着什么,但描述它需要一段时间。