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