问个问题,因为今天有一件事让我很困惑。下面是一段 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 解释器会考虑永远不会执行的代码?
最佳答案
不能在 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/