快速提问,因为今天有一件事困扰我。下面是一段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解释器会考虑从未执行过的代码片段?
答案 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
。