为什么Javascript代码打印'未定义'即使变量被声明为全局变量
Why Javascript code prints 'undefined' even when variable is declared global?
为什么下面的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/
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 函数中的innerHTML(全局变量?)
- 如何在javascript中为全局变量赋值
- 全局变量只能由第一个函数访问
- 当javascript中的条件变量(全局变量)发生变化时,停止循环