Javascript JS中的非唯一变量名

Javascript JS中的非唯一变量名,javascript,Javascript,反复使用变量名有效吗?例如: function clicks() { var foo = document.getElementById("cat"); foo.click(); var foo = document.getElementById("dog"); foo.click(); // Again! This works, but may be it is not valid? } function bar () { if (true) {

反复使用变量名有效吗?例如:

function clicks() {
    var foo = document.getElementById("cat");
    foo.click();

    var foo = document.getElementById("dog");
    foo.click(); // Again! This works, but may be it is not valid?
}
function bar () {
    if (true) {
        let foo = 5
    }

    console.log(foo)    // not defined
    // you would need to declare foo again with `let foo = ...`
}
或者我应该使用唯一的变量名,如下所示

function clicks() {
    var foo1 = document.getElementById("cat");
    foo1.click();

    var foo2 = document.getElementById("dog");
    foo2.click();
}

是的,它是有效的。这是因为解释器“提升”变量声明。也就是说,它将声明移动到当前函数范围的顶部

对于解释器,您的代码“看起来”如下:

function clicks () {
    var foo;

    foo = /* something */

    foo = /* something */
}
现在,如果不希望出现这种行为,可以使用保持当前范围的
let
。例如:

function clicks() {
    var foo = document.getElementById("cat");
    foo.click();

    var foo = document.getElementById("dog");
    foo.click(); // Again! This works, but may be it is not valid?
}
function bar () {
    if (true) {
        let foo = 5
    }

    console.log(foo)    // not defined
    // you would need to declare foo again with `let foo = ...`
}

覆盖变量的值没有什么错。请注意,这可能会使应用程序的行为更加混乱,例如,如果有人在阅读您的代码时没有注意到您重新声明变量的位置。请注意,声明一次之后,只需执行
foo=document.getElementById(“dog”)而不是
var foo=document.getElementById(“dog”)

您不能在js中重新实例化变量,因此
var foo
两次都不应该工作:/

解决办法是使用这样的东西

function clicks() {
    var foo = document.getElementById("cat");
    foo.click();

    //remove var in this line...
    foo = document.getElementById("dog");
    foo.click(); // Again! This works, but may be it is not valid?
}

从技术上讲,可以使用多个同名变量,但它们都将共享同一实体。它将只是该名称下的一个变量


但实际上你应该避免这种情况。

注意:
let
是一种新语法,并不是所有正在使用的浏览器都支持它。它工作正常。第二个声明
var foo
被忽略,它只是成为
foo
的赋值,变量没有“实例化”;他们被宣布了。我被这个答案弄糊涂了。它们不是“共享同一实体的同名多变量”,不管这意味着什么。它是一个变量,出现在两个
var
语句中。他不是说覆盖变量的值。他说的是重新定义它,这是完全不同的。但没有重新定义变量的事情,既然变量声明被提升到了作用域的顶部,为什么会让行为变得更加混乱呢?@royhowie我说这可能会让行为变得更加混乱,因为如果有人只看到初始声明而没有覆盖,他们可能会认为“cat”被再次点击而不是“dog”。@TAGraves但这与此有什么关系呢
var foo=…
vs.
foo=…
?我建议你收紧你的问题。你想要解决的问题是什么?为什么不在两件不同的事情上使用两个变量呢?你担心更多的变量代价会更高?“valid”是什么意思?语法上有效,jshint有效,还是概念上有效?在任何情况下,如果您确实决定“重用”一个变量,您不需要再次声明它——第二个声明将被忽略。