首页 > 解决方案 > 为什么 For 循环在没有正确初始化的情况下仍然可以工作?

问题描述

如果我从 javascript for 循环中省略了 'let' 或 'var',它仍然有效。因此,与其在循环中声明“让 i = 0”并只输入“i = 0”,它似乎仍然具有相同的范围并且工作方式相同。这是为什么?

“i++”部分如何在不知道它是什么类型且不知道它的起始值的情况下工作?

此代码仍然正确执行:


<p id="demo"></p>
<p id="i"></p>

<script>
const cars = ["BMW", "Volvo", "Saab", "Ford", "Fiat", "Audi"];

let text = "";
let iter = "";
for (i = 0; i < cars.length; i++) {
  text += cars[i] + "<br>";
  iter = i;
}

document.getElementById("demo").innerHTML = text;
document.getElementById("i").innerHTML = iter;
</script>```

标签: javascriptfor-loop

解决方案


在 JavaScript 中,如果在变量初始化期间省略“var”、“let”或“const”关键字,它将被初始化为 GLOBAL 变量。

您的“i”变量将在 for 循环之外可见。该循环当然可以工作,因为它已正确初始化,但请注意声明全局变量的所有缺点。

只是为了获得更好的线索,您可以尝试在 for 循环之外操纵这个“i”变量,或者只使用

console.log(i)

换句话说,在不使用“var”、“let”或“const”的情况下声明一个变量(我们称其为“index”)相当于将其声明为

window.index = 0;
//100% equivalent to
index = 0;

编辑:我没有提到的一个例外是您使用“严格模式” https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

在这种情况下,它将像您最初期望的那样抛出异常。要在严格模式下声明变量,您必须使用“let”、“var”或“const”关键字。

如果使用严格模式,则声明全局变量的唯一方法是通过 window 对象

window.yourNewGlobalVariable = 'whatever' //works in strict mode
yourNewGlobalVariable = 'whatever' // doesn't work in strict mode

推荐阅读