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

Global variable returned as undefined when it is again declared locally in a block and referred before the declaration in the block.

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

此代码提示未定义。

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

提前感谢大家。希望有人帮我解释一下。

因为变量 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();

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

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

阅读 Javascript 中关于 hoisting 的更多信息:Javascript hoisting explained

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

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

这看起来就像您要在此处实现的目标。

发生这种情况是因为,如果您声明了同名的全局变量和局部变量,当您尝试在函数内部使用该变量时,局部变量将具有优先权 .话虽如此,由于您尝试警告 a 的值并且您在函数范围内定义了一个具有相同名称的局部变量,因此在警告中将出现局部变量的值。但是,您在 alert 语句之后声明变量。因此它的值是未定义的。

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

var a = 10;

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

example();