【问题标题】:Global variable undefined - scope issue全局变量未定义 - 范围问题
【发布时间】:2015-08-18 18:16:03
【问题描述】:

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

var a = 1;
four();

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

  alert(a); //alerts undefined
}

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

【问题讨论】:

  • 我认为这里发生的事情是函数定义中的 a 被提升到函数的顶部,因此您正在提醒的 a 是函数定义中未定义的“a”,因为除非执行 if 语句,否则不会分配 a。
  • @Brodie:这与函数提升无关。
  • @SLaks 想说的是,由于 a 被分配为函数 four 的变量,因此在运行之前它在函数范围内被设置为未定义。 -- 对不起,如果我的术语不对。

标签: javascript scope


【解决方案1】:

由于变量声明被“提升”到其作用域的顶部,第二个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
}

【讨论】:

    【解决方案2】:

    是的。

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

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

    【讨论】:

    • 我认为这并不能完全回答问题。还有一个问题是“为什么不打印14?为什么是undefined?”
    • @Jashaszun:因为局部变量没有值。
    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2014-09-17
    • 2010-11-26
    • 2012-05-26
    • 2012-04-29
    • 2020-11-15
    相关资源
    最近更新 更多