Javascript 在函数范围内重新声明的全局变量的值
我的问题可能有点“学校化”,但我偶然发现了这段代码,我意识到我不明白为什么它返回“未定义”。通过使用Chrome调试器,我注意到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
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这也很准确,但是对于学习这种语言的人来说,“函数”一词很容易理解,因为它在屏幕上,而“闭包”一词有点模糊。我知道这意味着什么,但描述它需要一段时间。