期待在Javascript中未定义

时间:2014-06-05 15:42:37

标签: javascript

我看到了一些Javascript代码,我偶然发现了这样的事情:

function() {
    if(true) {
        var a = 5;
    }
    alert(a);
}

我很确定这会输出undefined但不是吗?有人可以告诉我为什么吗?

4 个答案:

答案 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关于范围的好教程。