JavaScript变量问题的澄清

JavaScript变量问题的澄清,javascript,scope,Javascript,Scope,从1996年开始编写JavaScript,我有一个非常简单的问题,我无法用JSFIDLE清楚地证明/反驳 在一些附在简历上的JS中,我发现了一些我想验证的问题,其中之一就是 同一函数中变量的多个声明 在较新的浏览器(OSX Chrome16 Fx 10beta)中测试它似乎是允许的——据我记忆所及,它曾经给出错误(Netscape/Mozilla/Fx1/IE5或其他): 我的小提琴是据我所知,我见过javascript函数有多个for循环,每个for循环声明自己的var I至少6年都没有问题

从1996年开始编写JavaScript,我有一个非常简单的问题,我无法用JSFIDLE清楚地证明/反驳

在一些附在简历上的JS中,我发现了一些我想验证的问题,其中之一就是 同一函数中变量的多个声明

在较新的浏览器(OSX Chrome16 Fx 10beta)中测试它似乎是允许的——据我记忆所及,它曾经给出错误(Netscape/Mozilla/Fx1/IE5或其他):


我的小提琴是

据我所知,我见过javascript函数有多个for循环,每个for循环声明自己的
var I
至少6年都没有问题

看了规范之后,这方面似乎没有什么具体的内容,但是由于(特别是全局)变量名覆盖(读:冲突)从一开始就是一个特性,如果对多个声明施加限制,我会非常惊讶


就目前情况而言,我认为它在javascript的作用域(和提升)方面并没有表现出特别好的知识,但仍然是有效的代码。

我使用javascript的时间和你一样长,我不记得这曾经被解释器禁止过。看看规范,我看不到有人提到确保变量声明在给定范围内是唯一的;这将是一个奇怪的功能删除


缺少这样的检查,加上变量是函数~而不是块作用域,似乎是导致误解的原因之一,其中一个块中“声明”的变量意外地具有它在前一个块中的最后一个值。

我很确定解析器忽略了第二个“var”-声明,因为它是冗余的——它所做的一切都意味着变量被限制在局部范围内。没有理由在同一个作用域中使用它两次,就像在同一个函数中一样,但是如果你,如@rich.okelly所指出的,有循环或函数,你确实可以使用“var”来创建一个与更高作用域中的变量同名的局部变量。它并不漂亮,当然也不会给可读性带来任何奇迹,但这是可能的。我从未遇到过浏览器在两次使用“var”前缀变量时挂断

例如:

x = "Hello";

function test() { 
    alert(x); // Outputs "Hello"
}
function test2() { 
    var x = "local variable";
    alert(x); // ouputs "local variable"
    var x = "changed the variable"; // this does exactly the same thing as if you'd omitted "var"
}
alert(x); // Outputs "Hello"

谢谢-我模模糊糊地记得Netscape、Mozilla或FX1等给了我一个错误,但因为它只对我发生过一次,我可能错了——我知道它在for循环中有效,但这对我来说是非常局部的scope@mplungjanfor循环中的
var i
与函数作用域中声明的任何其他变量一样被提升到函数的顶部-循环中的所有
i
s都引用相同的变量。这种情况与您描述的情况类似。谢谢-我很确定,但我自己从来没有遇到过这个问题,所以我想问一下,这就是我的小提琴在Fx10/Chrome16中所做的,但这还不足以让我从表面上理解它。
x = "Hello";

function test() { 
    alert(x); // Outputs "Hello"
}
function test2() { 
    var x = "local variable";
    alert(x); // ouputs "local variable"
    var x = "changed the variable"; // this does exactly the same thing as if you'd omitted "var"
}
alert(x); // Outputs "Hello"