我看到了一些Javascript代码,我偶然发现了这样的事情:
function() {
if(true) {
var a = 5;
}
alert(a);
}
我很确定这会输出undefined但不是吗?有人可以告诉我为什么吗?
答案 0 :(得分:14)
JavaScript具有功能级别范围,而不是块级别范围。
var
语句已被提升,因此您的代码相当于:
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
如果JavaScript具有块级范围,那么它仍然不会输出undefined
。由于a
语句中未声明alert
,因此会触发引用错误。
答案 1 :(得分:3)
这种作用的原因是所谓的提升的结果。提升将变量的声明移动到范围的顶部。所以你的功能真的是这样的:
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
"因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明变量。这也意味着变量可以在声明之前使用。这种行为被称为" hoisting",因为看起来变量声明被移动到函数或全局代码的顶部。" - var MDN
答案 2 :(得分:2)
变量定义被移动到函数的顶部(变量提升);没有块级变量。
编译器将您的代码更改为
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
答案 3 :(得分:2)
JS没有块范围只是函数\全局范围 在您的情况下,var在函数顶部声明没有值,然后被赋值。
Here's关于范围的好教程。