Javascript 全局变量未定义-范围问题
在运行以下代码时,我希望函数末尾的警报使用全局定义的变量值“a”(1),但它返回未定义的值。如果If块中的代码从未运行过,为什么变量“a”返回为未定义Javascript 全局变量未定义-范围问题,javascript,scope,Javascript,Scope,在运行以下代码时,我希望函数末尾的警报使用全局定义的变量值“a”(1),但它返回未定义的值。如果If块中的代码从未运行过,为什么变量“a”返回为未定义 var a = 1; four(); function four() { if (false) { var a = 4; } alert(a); //alerts undefined } javascript解析器在条件表达式范围内“查看”变量声明的方式是否与在条件表达式范围外“查看”变量声明的方式相同?是 所有Java
var a = 1;
four();
function four() {
if (false) {
var a = 4;
}
alert(a); //alerts undefined
}
javascript解析器在条件表达式范围内“查看”变量声明的方式是否与在条件表达式范围外“查看”变量声明的方式相同?是
所有Javascript变量(和函数)声明都被“提升”到其包含函数
a
局部变量存在于整个函数中(甚至在if
之前),但仅在赋值后才有值。由于变量声明被“提升”到其作用域的顶部,第二个变量a
被设置在函数作用域内。所以从本质上讲,它变成了:
function four() {
var a;
if (false) {
a = 4;
}
alert(a); //alerts undefined
}
如果要删除four
函数中的第二个赋值,则会向窗口.a
变量发出警报,而不是four.a
变量
即:
我认为这并不能完全回答这个问题。还有一个问题是“为什么它不打印
1
或4
?为什么未定义
?”@Jashaszun:因为局部变量没有值。我认为这里发生的是函数定义中的a被提升到函数的顶部,因此,您发出警报的a是函数定义中未定义的“a”,因为除非if语句执行,否则a不会被赋值。@Brodie:这与函数提升无关。@SLaks试图说的是,因为a被赋值为函数four
的变量,在运行之前,它在函数的作用域内被设置为未定义。-对不起,如果我的术语不适用。
var a = 1;
function four() {
if (false) {
a = 4;
}
alert(a); //alerts 1
}