Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 全局变量未定义-范围问题_Javascript_Scope - Fatal编程技术网

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

Javascript 全局变量未定义-范围问题,javascript,scope,Javascript,Scope,在运行以下代码时,我希望函数末尾的警报使用全局定义的变量值“a”(1),但它返回未定义的值。如果If块中的代码从未运行过,为什么变量“a”返回为未定义 var a = 1; four(); function four() { if (false) { var a = 4; } alert(a); //alerts undefined } javascript解析器在条件表达式范围内“查看”变量声明的方式是否与在条件表达式范围外“查看”变量声明的方式相同?是 所有Java

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

var a = 1;
four();

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

  alert(a); //alerts undefined
}
javascript解析器在条件表达式范围内“查看”变量声明的方式是否与在条件表达式范围外“查看”变量声明的方式相同?

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


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

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

function four() {
  var a;

  if (false) {
    a = 4;
  }

  alert(a); //alerts undefined
}
如果要删除
four
函数中的第二个赋值,则会向
窗口.a
变量发出警报,而不是
four.a
变量

即:


我认为这并不能完全回答这个问题。还有一个问题是“为什么它不打印
1
4
?为什么
未定义
?”@Jashaszun:因为局部变量没有值。我认为这里发生的是函数定义中的a被提升到函数的顶部,因此,您发出警报的a是函数定义中未定义的“a”,因为除非if语句执行,否则a不会被赋值。@Brodie:这与函数提升无关。@SLaks试图说的是,因为a被赋值为函数
four
的变量,在运行之前,它在函数的作用域内被设置为未定义。-对不起,如果我的术语不适用。
var a = 1;

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

  alert(a); //alerts 1
}