技术文摘
JavaScript 代码中 `i` 始终输出 6 的原因
2025-01-09 16:01:15 小编
JavaScript 代码中 i 始终输出 6 的原因
在 JavaScript 编程过程中,不少开发者会遇到这样的困惑:代码里的变量 i 无论如何操作,最终输出的总是 6。这背后究竟隐藏着怎样的逻辑呢?
我们要考虑作用域的问题。JavaScript 有函数作用域和块级作用域(ES6 引入 let 和 const 后)。如果在函数外部声明了一个全局变量 i,并在函数内部没有使用 var、let 或 const 重新声明,那么函数内部对 i 的修改就会直接影响到全局变量。例如:
var i = 1;
function test() {
i = 6;
}
test();
console.log(i);
在这个例子中,函数 test 没有重新声明 i,所以它直接修改了全局变量 i 的值,最终输出 6。
闭包也可能导致这种情况。闭包是指有权访问另一个函数作用域中的变量的函数。当我们在循环中创建闭包时,如果不注意,就会出现问题。
var arr = [];
for (var i = 0; i < 5; i++) {
arr.push(function () {
return i;
});
}
for (var j = 0; j < arr.length; j++) {
console.log(arr[j]());
}
在这段代码中,循环结束后 i 的值已经变为 5,所有闭包函数捕获到的 i 都是同一个变量,且此时它的值为 6。所以,当调用这些闭包函数时,都会返回 6。
另外,如果使用 let 关键字声明 i,情况就会有所不同。
let arr = [];
for (let i = 0; i < 5; i++) {
arr.push(function () {
return i;
});
}
for (let j = 0; j < arr.length; j++) {
console.log(arr[j]());
}
这里每个闭包函数都会有自己独立的 i 副本,所以会输出预期的 0 到 5。
JavaScript 代码中 i 始终输出 6,主要是由于作用域和闭包的特性导致的。理解这些概念,并正确使用变量声明关键字,是避免这类问题的关键。只有深入掌握 JavaScript 的运行机制,才能编写出更健壮、可靠的代码。
- 小白前端之 Ul 标签创建无序列表入门笔记
- 别再依赖 Print 调试 Python,答应我!
- 数据中台终被讲清,原不算啥
- Github 上 Star 达 10k 的超好用 OCR 数据合成及半自动标注工具
- 五分钟精通 Python 随机爬山算法
- 27 岁发明 SQL 后,上帝竟将他带走
- Java 小白必知的两大怪物及相关面试题
- 数据科学及人工智能从业者编程能力的提升之道
- Swagger 3.0 的全新变化,您知否?
- 4 种速度迟缓的动态编程语言,或许你曾使用
- 华尔街不讲武德 围剿美国散户:拔网线 删代码 关服务器
- 微软推出低温量子控制平台 可控制数千量子比特 研究成果登自然子刊
- 我们是否真正理解了这些排序算法?
- ERP 盛行了 20 年,“中台”为何仅 5 年便消失?
- JavaScript 函数:一文全知晓