如果重新声明,全局变量会覆盖函数范围,甚至在重新声明JavaScript之前[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我不明白为什么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_VERSION在进入if之前是undefined(所以如果它有某些东西它会被删除)。

提前致谢!

javascript scope undefined global overwrite
2个回答
0
投票

它不会覆盖全局值 - 实际上,你不能,因为const VAR1创建了一个常量 - 这永远不能通过使用=直接重新分配。您的代码正在经历变量提升 - 这是一个解释:

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

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

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

如果在没有local-scoped变量的情况下运行代码,那么它通过查看全局范围来工作(因为变量从当前范围向外工作):

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);
}

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>

您可能想要阅读有关吊装,Old-School var声明和TDZ的更多信息。 - 问候,M。

© www.soinside.com 2019 - 2024. All rights reserved.