澄清JavaScript变量问题

时间:2012-01-20 09:57:20

标签: javascript scope

自1996年开始编写JavaScript以来,我有一个非常简单的问题,我无法用jsfiddle明确证明/反驳

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

测试它似乎允许在较新的浏览器(OSX Chrome16 Fx 10beta) - 据我记得它曾经给出错误(Netscape / Mozilla / Fx1 / IE5左右):

function something() {
  var var1 = "";
.
/* reams of code which scrolls the first declaration off the screen 
   so the author likely forgot the var was already declared earlier 
   in the same function */
.
  var var1 = ""; // could this result in an error in some browsers?
}

我的小提琴是here

3 个答案:

答案 0 :(得分:3)

据我所知,我已经看到javascript函数有多个for循环,每个循环声明自己的var i至少6年都没有问题。

看了这个规范后,这个区域似乎没有什么具体的东西,但是因为(特别是全局的)变量名称覆盖(读取:冲突)从一开始就是一个特征,如果对多个声明有所限制,我会非常惊讶是强制性的。

按照目前的情况,我建议它在javascript中没有显示特定的知识范围(和提升),但仍然是有效的代码。

答案 1 :(得分:2)

我和你一直在玩javascript,我不记得这是一个翻译所禁止的。看一下ECMAScript 1规范,我没有提到确保变量声明在给定范围内是唯一的;删除它将是一个奇怪的功能。

缺少这样的检查,以及变量是函数〜而不是块作用域的事实,这似乎是导致误解的事情之一,其中一个块中的“声明”变量意外地具有最后一个值曾经在前一个街区。

答案 2 :(得分:2)

我很确定解析器会忽略第二个“var” - 声明,因为它是多余的 - 它所做的只是表示变量仅限于本地范围。没有理由在相同的范围内使用它两次,就像在同一个函数中一样,但是如果你像@ rich.okelly指出的那样,有循环或函数,你确实可以使用“var”创建一个同样的局部变量将name命名为更高范围内的变量。它不漂亮,当然也没有任何可读性的奇迹,但它是可能的。我从来没有遇到一个浏览器,它挂起了两次使用“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"