Javascript函数和变量范围

时间:2014-04-25 14:22:50

标签: javascript variables scope

快速提问,因为今天有一件事困扰我。下面是一段JavaScript代码:

var a = [1, 2, 3, 4];

function init() {

    console.log(a);

    if (false) {
        var a = [9, 8, 7];
    }
}

init();

这个简单的代码记录" undefined"在JS控制台中。我发现原因是第5行:

var a = [9, 8, 7];

在该条件中没有单词var,它将记录正确的结果[1, 2, 3, 4]

我的问题是:为什么JavaScript解释器会考虑从未执行过的代码片段?

使用示例:http://jsfiddle.net/5DPCz/

2 个答案:

答案 0 :(得分:4)

您无法在JavaScript中的函数的中间中声明变量; 所有变量都有函数范围。实际上,变量声明是"hoisted"到函数的顶部。您的函数只能访问局部变量a,无论函数在何处被声明。

这就是为什么JSLint(和大多数其他linting工具)会建议你将所有变量声明移到函数顶部的原因;无论如何,这是他们有效写的地方。

无论您的功能在何处放置var a,您的代码都会以这种方式有效执行:

var a = [1, 2, 3, 4];

function init() {
    var a;

    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

答案 1 :(得分:0)

您的示例等同于

var a = [1, 2, 3, 4];

function init() {
    var a;
    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

现在您可以看到它打印undefined的原因。 该函数的本地a尚未在该点分配值。

如果您移除var,请将其转为

var a = [1, 2, 3, 4];

function init() {
    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

因此,函数中的a现在引用全局范围内的a