全局变量未定义 - 范围问题

时间:2015-08-18 18:16:04

标签: javascript scope

运行以下代码时,我希望函数末尾的警报使用全局定义的变量值“a”(1),但它返回undefined。如果if块中的代码永远不会运行,为什么变量“a”返回为undefined?

var a = 1;
four();

function four() {
  if (false) {
    var a = 4;
  }

  alert(a); //alerts undefined
}

javascript解析器是否在条件表达式范围内“看到”变量声明的方式与在其外部“看到”它的方式相同?

2 个答案:

答案 0 :(得分:2)

由于变量声明被“提升”到其作用域的顶部,因此第二个var a被设置在函数作用域内。所以基本上它变成了像:

function four() {
  var a;

  if (false) {
    a = 4;
  }

  alert(a); //alerts undefined
}

如果您要删除four功能中的第二个分配,则会提醒window.a变量而不是four.a变量。

即:

var a = 1;

function four() {
  if (false) {
    a = 4;
  }

  alert(a); //alerts 1
}

答案 1 :(得分:0)

所有Javascript变量(和函数)声明都被“提升”到它们的包含函数。

a局部变量存在于整个函数中(甚至在if之前),但在分配后只有一个值。