javascript - 两个相同的命名标识符如何导致此代码中的无限循环?
问题描述
任何人都可以从 ydkjs 解释这段代码。主题是防撞。这是一个无限循环,我无法理解如何?我在 sublime 文本编辑器中运行代码,第一个输出是 3,然后第二个输出是 11,它可以无限运行。
function foo() {
function bar(a) {
i = 3;
console.log(a + i);
}
for (var i = 0; i < 10; i++) {
bar(i * 2);
}
}
foo();
解决方案
当你使用 声明一个变量时var =
,它的作用域是整个函数。您的代码大致相当于:
function foo() {
var i;
for (i = 0; i < 10; i++) {
i = 3;
}
}
foo();
这显然是一个无限循环,i
永远不会变成>= 10
如果您使用let i = 0
, theni
将被限定为循环,因此i
内部的“其他”bar
无关紧要:
function foo() {
function bar(a) {
i = 3;
console.log(a + i);
}
for (let i = 0; i < 10; i++) {
bar(i * 2);
}
}
foo();
推荐阅读
- python - 在 Python 中获取特定的用户输入字符
- sql-server - 在 SQL Server Management Studio 中恢复未保存的 SQL 查询脚本
- ios - 添加 AllInOneSDKSwiftWrapper.swift 后,如何在一个 sdk 中实现 Paytm all in react native 给出错误
- python - Scrapinghub (Scrapy Cloud) - 每个项目的蜘蛛数量有限制吗?
- mapbox-gl-js - 在 Mapbox GL 中有一种方法可以让符号的标签成为自定义 HTML
- web - heroku 托管是如何构建的?它如何支持这么多语言的项目来托管它?
- r - 优化错误(par = par,fn = fun,method = "L-BFGS-B",lower = lb,upper = ub):L-BFGS-B 需要 'fn' 的有限值
- mongodb - Logstash 无法加载,文件不可读
- android - Android ROOM - 如何在对象内插入对象(即 Flash Card Deck 有一个问题列表)
- flutter - Flutter 中的动态自定义日历