Javascript 函数和变量范围

标签 javascript variables scope

问个问题,因为今天有一件事让我很困惑。下面是一段 JavaScript 代码:

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

function init() {

    console.log(a);

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

init();

这个简单的代码在 JS 控制台中记录“未定义”。我发现原因是第5行:

var a = [9, 8, 7];

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

我的问题是:为什么 JavaScript 解释器会考虑永远不会执行的代码?

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

最佳答案

不能在 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();

关于Javascript 函数和变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23295814/

相关文章:

在 onclick 属性内部使用时,JavaScript 函数不起作用

javascript - 如何找出我刚刚在 jQuery 中提交的表单?

javascript - 在现代浏览器中删除文件

unicode - g++ unicode 变量名

javascript - 更新 Angular forEach 内部的外部变量

java - 常量的命名;先输入还是先命名?

java - 为什么这段代码特别出现 3 个错误?

javascript 日期时间比较

javascript - 当我尝试用自身更新属性时,JSLint 会提示

javascript - 由于参数不执行,因此使用其他选择器重新选择选择器