全局变量覆盖本地变量

时间:2015-05-21 14:29:31

标签: javascript

以下测试成功,并打印11

function test1() {
    a = 1;
    console.log(a); // prints "1"
}
function test2() {
    console.log(a); // prints "1"
}
test1();
test2();

以下测试失败,因为局部变量会覆盖先前创建的全局变量:

function test1() {
    a = 1;
    var a = 2;
    console.log(a); // prints "2"
}
function test2() {
    console.log(a); // throws an error
}
test1();
test2();

为什么第二个示例会永久删除全局变量?这种功能在JavaScript中有什么用途/逻辑?

已编辑:对于将其标记为Strange Behavior on Global and Local Variable in JavaScript的副本的人

提升是指稍后声明的局部变量向上移动到函数范围,覆盖先前可见变量的情况。但在我们的例子中,函数首先创建一个全局变量,然后完全/全局删除它。

然而,它可能是相关的,正如我们在以下测试中看到的那样:

function test1() {
    a = 1;
    console.log(a); // prints "1"
}
function test2() {
    console.log(a); // prints "undefined"
    var a = 2;
}
function test3() {
    console.log(a); // prints "1"
}
test1();
test2();
test3();

2 个答案:

答案 0 :(得分:2)

在第二种情况下,没有名为a的全局变量。

a = 1通常不会创建全局变量。语句a = 1将值1存储在名为a的变量中。如果任何包含局部范围的变量环境都有一个名为a的变量,则带有a变量的最近范围将该变量设置为1

作为一种特殊情况,如果一个名为a的变量确实存在于任何包含范围内(并且如果您没有处于严格模式),那么JavaScript引擎将创建一个全局名为a的变量。

在第二种情况下,var a在本地范围内创建a变量。由于提升,对范围的可变环境的修改发生在任何代码运行之前。因此,在执行a = 1时,该局部范围确实有一个名为a的变量,因此使用了局部变量。

在第三种情况下,test2记录局部变量a(由var a创建)。在进行log调用时,尚未为本地a分配值。

  

提升是指稍后声明的局部变量向上移动到函数范围,覆盖先前可见变量的情况。

吊装只是意味着所有var声明都被视为发生在其包含函数的顶部。它(直接)与覆盖变量可见性无关。

请注意,带有赋值的声明只会提升声明,而不是赋值。无论在函数中的哪个位置,赋值都会保留在原位。

答案 1 :(得分:1)

Javascript将变量声明移到顶部。因此,在此示例中,编译器将代码读取为:

"My New View" - // Row for Expandable ListView,which is RelativeLayout(into this Layout i got TextView).