javascript - 为什么 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>```
解决方案
在 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
推荐阅读
- vb.net - 从代码隐藏有条件地隐藏/显示中继器内的按钮
- javascript - 按键后重置 lodash 去抖动
- html - href 被 ng-click 覆盖 - 移动
- css - full calendar_scheduler - 如何在垂直议程日设置最小宽度资源列并进行水平滚动
- powershell - powershell中的cut等效命令是什么
- c++ - LNK2019 未解析的外部符号“public: __thiscall
- java - add(...) in List cannot be applied to (...)
- reactjs - React-Admin,根据ReferenceInput清空ArrayInput
- java - 使用 KStream 从阈值中过滤掉值
- c# - 检查 C# 中的本地化异常