了解Javascript中的全局和本地范围

ste*_*ino 10 javascript

我一直在使用Stoyan Stefanov使用面向对象的JavaScript学习Javascript

他提供了一个比较全局和本地范围的示例:

var a = 123;
function f() {
    alert(a);
    var a = 1;
    alert(a);
}
f();
Run Code Online (Sandbox Code Playgroud)

看看这个例子,我预计第一个警报为'123',第二个警报为'1'.瞧,斯托扬说:

您可能希望第一个alert()将显示123(全局变量a的值),第二个将显示1(本地a).不是这种情况.第一个警报将显示"未定义".这是因为在函数内部,局部范围比全局范围更重要.因此局部变量会覆盖具有相同名称的任何全局变量.在第一个alert()时,a尚未定义(因此值未定义),但它仍然存在于本地空间中.

我的解释并不清楚,局部变量如何在第一个警报中覆盖全局变量?任何其他/不同的解释将不胜感激.

Jua*_*des 10

它不会覆盖全局变量.发生的事情被称为"可变吊装".也就是说,a var a;插入函数的顶部.

脚本引擎将脚本更改为以下内容:

var a = 123;
function f() {
    var a;
    alert(a);
    a = 1;
    alert(a);
}
f();
Run Code Online (Sandbox Code Playgroud)

需要学习的经验:在使用之前始终声明变量.有些人会说在函数顶部声明所有变量.

  • 覆盖不是正确的术语,局部变量**影子**全局变量,但真正的问题是要理解如果你在函数内的任何地方都有一个`var`,整个整个**都会被遮蔽**功能,甚至在声明之前. (3认同)