今天我遇到了一些JavaScript,看起来像这样:
var x = "abc";
var y = true;
if (y) {
var x = "xyz";
}
alert(x);
作为Perl开发人员,这看起来像一个错误,因为x
在更严格的范围内重新声明,并且指定的值应该丢失。但是,在测试时,代码似乎按预期工作。
如果重新声明变量,var
是否会被忽略并保留原始范围?
答案 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;