JavaScript中全局变量和局部变量的奇怪行为

时间:2013-03-30 03:46:12

标签: javascript scope

我尝试了以下代码:

var a = 5;

function x() {
  console.log(a);
}

x();

按预期运行并打印5。

但我更改了代码,因此全局变量a将覆盖如下:

var a = 5;

function x() {
  console.log(a);
  var a = 1;
}

x();

打印未定义。它对我来说没有意义,因为覆盖应该在console.log(a)之后发生。那么问题是什么?

2 个答案:

答案 0 :(得分:5)

这种情况正在发生,因为您的第二个a变量被“提升”到函数的顶部,它隐藏了第一个a。实际发生的是:

var a = 5;

function x() {
  var a;
  console.log(a);
  a = 1;
}

x();

Here is an article on hoisting from adequately good有关此主题的进一步阅读。

答案 1 :(得分:0)

var a = 5;

function x() {
    var a = 1;
console.log(a);
}

x();

您需要在console.log();

之前初始化变量a