为什么 Javascript 代码即使在声明变量是全局的时也能打印'undefined'?



为什么下面的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/

相关内容

  • 没有找到相关文章

最新更新