为什么Javascript代码打印'undefined'即使变量被声明为全局?

时间:2016-03-23 12:34:17

标签: javascript global-variables

为什么下面的JS代码打印'未定义'?有人可以解释一下JS是如何运作的吗?

var regular = 'regular is assigned';

function prison() {
  console.log(regular);
  var regular;
}
prison();

谢谢!

4 个答案:

答案 0 :(得分:2)

这是一个范围问题。 在您的函数内部,您声明了创建的新范围。 Javascript将变量decleration提升到top函数。由于变量没有值,因此它是undefined。 在窗口中创建的regular变量在函数的范围内不存在。

答案 1 :(得分:1)

var regular = 'regular is assigned';

function prison() {
  console.log(regular);
  //var regular;
}
prison();

原因是已注释掉的关键字。

Javascript在执行任何代码之前将所有变量移到顶部。

在您的情况下,打印局部变量regular而不是首先声明regular变量.. Documentation

所以你的代码执行如下

  var regular = 'regular is assigned';

function prison() {
  var regular;//Moved here as per JS Scope 
  console.log(regular);//Hence it is undefined
}
prison();

答案 2 :(得分:1)

您的函数重新定义变量。它低于console.log调用并不重要 - 它总是被重新定义为完整范围。

答案 3 :(得分:1)

你所看到的是悬挂。即使您在使用它之后声明了变量,变量声明也会移动到函数的顶部。正如您所期望的那样,局部变量会覆盖全局变量,因此它未定义。

采用以下示例:

<div class="appearingitem" ng-show="timeduration"></div>

调用函数后function hoist(num){ message = "I'm not five" if(num === 5) { var message = "I am five"; } console.log(message); } hoist(5); console.log(message); 会抛出异常。如果没有提升,conosle.log变量的第一个赋值将创建一个全局变量,但它不会。变量声明被移动到顶部,使得对消息的赋值发生在局部变量上,而不是创建全局变量。

https://jsfiddle.net/Ldbhtv3v/