为什么Javascript代码打印'未定义'即使变量被声明为全局变量

Why Javascript code prints 'undefined' even when variable is declared global?

本文关键字:变量 全局变量 声明 未定义 Javascript 代码 打印 为什么      更新时间:2023-09-26

为什么下面的JS代码打印"未定义"?有人能解释一下JS是如何工作的吗?

var regular = 'regular is assigned';
function prison() {
  console.log(regular);
  var regular;
}
prison();

谢谢!

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

var regular = 'regular is assigned';
function prison() {
  console.log(regular);
  //var regular;
}
prison();

原因是注释掉的关键字。

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

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

所以你的代码执行如下

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

您的函数重新定义了变量。这在console.log调用之下并不重要——它总是为整个范围重新定义的。

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

举以下例子:

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抛出异常。如果没有提升,对message变量的第一次赋值将创建一个全局变量,但它没有。变量声明被移到顶部,使得对消息的赋值发生在局部变量上,而不是创建全局变量。

https://jsfiddle.net/Ldbhtv3v/