JavaScript变量问题的澄清

Clarification of a JavaScript variable issue

本文关键字:问题 变量 JavaScript      更新时间:2023-09-26

我从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?
}

我的小提琴在这里

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

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

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

我玩javascript的时间和你一样长,我不记得这是被解释器禁止的。查看ECMAScript 1规范,我看不到任何关于确保变量声明在给定范围内唯一的内容;这将是一个奇怪的特征删除。

缺少这样的检查,再加上变量是函数范围的,而不是块范围的,这似乎是造成误解的原因之一,其中一个块中"声明"的变量意外地具有上一个块的最后一个值。

我很确定解析器会忽略第二个"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"