我不明白为什么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
是undefined
甚至没有输入if(因此里面有东西会被删除)。
谢谢!
答案 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。