如果重新声明了全局变量,则覆盖了函数作用域,甚至在JavaScript中重新声明之前

时间:2019-03-31 00:18:20

标签: javascript scope undefined global overwrite

我不明白为什么var在调用之前会在函数内部覆盖全局变量的值。

const VAR1=3
document.onclick=()=>{
    console.log(VAR1);
    // var VAR1=2;
    console.log(VAR1);
}

当我单击时,此日志

3
3

符合预期,但如果我取消注释var VAR1=2;,我会得到

undefined
2

代替

3
2

即使我不希望它修改全局范围。

遇到此问题的原因是在编写库时,我说LIB_VERSION=x,然后我可以进行测试以查看使用它的程序中的版本,并避免它因随机错误消息而中断。

但是由于该库的某些旧版本没有这个定义,所以我说

function testVersion(){
    if (typeof LIB_VERSION==='undefined'){
        var LIB_VERSION="Unknown Version";
    }
    if (LIB_VERSION!==3){
        console.log("Your version of the library "+LIB_VERSION+" is not compatible with this program");
    }
}

我知道有几种变通办法,我想知道为什么会发生这种情况。

我注意到的另一件事是,如果我将console.log(LIB_VERSION)放在if语句之前,我会发现LIB_VERSIONundefined甚至没有输入if(因此里面有东西会被删除)。

谢谢!

2 个答案:

答案 0 :(得分:0)

这不会覆盖全局值-实际上,您不能这样做,因为const VAR1创建了一个常数-永远不能使用=直接重新分配它。您的代码正在发生可变吊装-这是一个解释:

您的代码包含两个同名的变量-一个在函数外部(全局范围),另一个在函数内部(本地范围)。

您正在尝试在分配函数之前读取该函数内部的变量。这使您的代码等效于此:

const VAR1 = 3;
document.onclick = () => {
    var VAR1;
    console.log(VAR1);
    VAR1 = 2;
    console.log(VAR1);
}

如果在没有本地作用域变量的情况下运行代码 ,则它通过查看全局作用域来工作(因为变量从当前作用域向外):

const VAR1 = 3;
document.onclick = () => {
    //There's no VAR1 here, so it goes out a level and looks for VAR1 there and so on until it finds it.
    console.log(VAR1);
    console.log(VAR1);
}

答案 1 :(得分:0)

这与事件处理程序中VAR变量的提升效果有关。 所以这个

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Document</title>
</head>
<body>
    <script>
     const VAR = 3;
     document.onclick = function(event) {
         console.log(VAR); // undefined, VAR in so-called Temporary Dead Zone
         var VAR = 2;
         console.log(VAR); // 2
     };
    </script>
</body>
</html>

等效于此

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Document</title>
</head>
<body>
    <script>
     const VAR = 3;
     document.onclick = function(event) {
         var VAR; // VAR declared but NOT defined, so VAR again in TDZ
         console.log(VAR); // undefined
         VAR = 2; // VAR defined
         console.log(VAR); // 2
     };
    </script>
</body>
</html>

您可能想了解有关起重,旧式var声明和TDZ的更多信息。 - 问候,M。