这种现象被称为:JavaScript 变量提升。
您绝不会访问函数中的全局变量;您只访问局部value
变量。
您的代码等效于以下内容:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
仍然惊讶你得到undefined
?
解释:
这是每个 JavaScript 程序员迟早都会遇到的事情。简单地说,你声明的任何变量总是被提升到本地闭包的顶部。因此,即使您在第一次console.log
调用后声明了您的变量,它仍然被视为您在此之前声明过它。
但是,只有申报部分正在被吊装;另一方面,分配不是。
因此,当您第一次调用 时console.log(value)
,您正在引用本地声明的变量,该变量尚未分配任何内容;因此undefined
。
这是另一个例子:
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
你认为这会提醒什么?不,不要只是继续阅读,考虑一下。的value是test
什么?
如果你说的不是start
,那你就错了。上面的代码等价于:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
这样全局变量永远不会受到影响。
如您所见,无论您将变量声明放在哪里,它总是被提升到本地闭包的顶部。
边注:
这也适用于函数。
考虑这段代码:
test("Won't work!");
test = function(text) { alert(text); }
这会给你一个参考错误:
未捕获的 ReferenceError:未定义测试
这让很多开发人员望而却步,因为这段代码运行良好:
test("Works!");
function test(text) { alert(text); }
如前所述,这样做的原因是因为分配部分没有被提升。所以在第一个例子中,当test("Won't work!")
运行时,test
变量已经被声明,但还没有分配给它的函数。
在第二个例子中,我们没有使用变量赋值。相反,我们使用了正确的函数声明语法,这确实使函数完全提升。
Ben Cherry在这方面写了一篇出色的文章,标题恰如其分的JavaScript 范围和提升。
阅读。它将为您提供完整详细的全貌。