在不同范围内重新声明变量

时间:2014-08-19 08:45:30

标签: javascript scope

今天我遇到了一些JavaScript,看起来像这样:

var x = "abc";
var y = true;

if (y) {
    var x = "xyz";
}

alert(x);

作为Perl开发人员,这看起来像一个错误,因为x在更严格的范围内重新声明,并且指定的值应该丢失。但是,在测试时,代码似乎按预期工作。

如果重新声明变量,var是否会被忽略并保留原始范围?

2 个答案:

答案 0 :(得分:3)

Javascript只有函数范围,而不是块范围。第二个var x =被视为普通赋值,就好像它只是x =一样,因为变量已经被声明了。

答案 1 :(得分:0)

在JS中只有全局(窗口)和功能范围。

var x = 1;
function a() { var x = 2; return x; }

alert(x); //1
alert(window.x); //1
alert(a()); //2

即使您在块内定义变量,它也将存在于整个范围

for (var i = 0; i < 10; i++) {
    var k = i+1;
}

alert(i);  //10
alert(window.k);  //10

编辑:因此,好的JS代码在每个范围的开头定义了它的变量

var i,j,max = 10;

function a() {
    var i,j,k;
    for (i = 0; i < max; i++) {
        j = i * 2;
        k = i / 2;
    }
    return i * j * k;
}

i = a();
j = a() * 2;