全局变量在块中本地再次声明并在块中的声明之前引用时返回为未定义。

时间:2015-01-31 15:17:22

标签: javascript global-variables local-variables

var a = 10;
function example(){
    alert(a);
    var a = 5;    
}
example();

此代码警告未定义。

我的问题是为什么变量a是警报"未定义"而不是返回全局变量的值。

我提前感谢大家。我希望有人能为我澄清一下。

3 个答案:

答案 0 :(得分:0)

由于变量a提升。以下是正在发生的事情。函数内部的a被提升到函数体的顶部,并且它隐藏了函数外部的a,其值为10

您在a初始化之前提醒您,a的默认值为undefined

var a = 10;
function example(){
    var a; // this is undefined and shadows the global a
    alert(a);
    a = 5;
    alert(a); // 5    
}
example();

答案 1 :(得分:0)

在Javascript函数中,变量的每个声明总是被提升到它的顶部,但不是赋值的值。你真正执行的是:

var a = 10;
function example(){
  var a;      //undefined!
  alert(a);   //still undefined!
  a = 5;      //only now it becomes 5    
}
example();

在Javascript中详细了解hoistingJavascript hoisting explained

为了避免声明新的局部变量,而只是使用已定义的全局变量:

var a = 10;
function example(){
  alert(a);
  a = 5;    
}
example();

这看起来就像你在这里想要实现的那样。

答案 2 :(得分:0)

这是因为,如果声明全局变量和具有相同名称的局部变量,当您尝试在函数中使用变量时,局部变量将具有优先级。话虽如此,由于您尝试提醒a的值并且您已在函数范围中定义了具有相同名称的局部变量,因此在警报中将显示局部变量的值。但是,您在alert语句后声明变量。因此,它的价值是未定义的。

如果您尝试运行以下代码段,我们已删除了名为a的另一个变量的声明,您将获得预期的行为。

var a = 10;

function example(){
    alert(a);
    a = 5;    
}

example();