JS中的非唯一变量名

时间:2015-12-05 04:29:01

标签: 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 clicks() {
    var foo1 = document.getElementById("cat");
    foo1.click();

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

4 个答案:

答案 0 :(得分:1)

是的,它是有效的。这是因为翻译"升降机"变量声明。也就是说,它将声明移动到当前函数范围的顶部。

对于口译员,您的代码"看起来"像这样:

function clicks () {
    var foo;

    foo = /* something */

    foo = /* something */
}

现在,如果您不想要这种行为,可以使用保留在当前范围内的let。例如:

function bar () {
    if (true) {
        let foo = 5
    }

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

答案 1 :(得分:-1)

覆盖变量的值没有错。请注意,它可能会使您的应用程序的行为更加混乱,例如,如果读取您的代码的人错过了您重新声明变量的位置。请注意,在您宣布之后,您可以foo = document.getElementById("dog");代替var foo = document.getElementById("dog");

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-2)

您无法在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?
}