这个问题在这里已有答案:
我不明白为什么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
(所以如果它有某些东西它会被删除)。
提前致谢!
它不会覆盖全局值 - 实际上,你不能,因为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);
}
这与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。