我一直在使用Object-Oriented JavaScript by Stoyan Stefanov
学习Javascript他提供了一个比较全局和本地范围的示例:
var a = 123;
function f() {
alert(a);
var a = 1;
alert(a);
}
f();
看一下这个例子,我预计第一个警报为'123',第二个警报为'1'。瞧,斯托扬说:
您可能希望第一个alert()显示123(值为 全局变量a)和第二个将显示1(本地a)。 不是这种情况。第一个警报将显示“未定义”。这是 因为在函数内部,局部范围比重要 全球范围。所以局部变量用。覆盖任何全局变量 同名。在第一次警报时()a尚未定义 (因此值未定义)但它仍然存在于本地空间中。
我的解释并不清楚,局部变量如何在第一个警报中覆盖全局变量?任何其他/不同的解释将不胜感激。
答案 0 :(得分:9)
它不会覆盖全局变量。发生的事情被称为“可变吊装”。也就是说,var a;
会插入函数的顶部。
脚本引擎将您的脚本更改为以下内容:
var a = 123;
function f() {
var a;
alert(a);
a = 1;
alert(a);
}
f();
要学习的课程:在使用变量之前始终声明变量。有人会说在函数顶部声明所有变量。
答案 1 :(得分:2)
简单来说,首先考虑变量和函数的所有声明。因此,本地var a
实际上只会在本地范围内覆盖全局变量,并且没有值,即undefined
。因此,首次提醒会显示undefined
。第二个警报将显示a = 1
之后的1。这只是在本地发生,全局变量a将具有值123 - 它不会被更改。
使用函数显示其工作原理的另一个例子
function show(){
alert("I am global");
}
function f() {
show();
show = function(){
alert("I am second");
}
show();
function show(){
alert("I am first");
}
}
f();
show();