javascript - 用于闭环的javascript
问题描述
我想我有点理解在 for 循环中var
用于初始化时提升的概念和函数闭包的概念。i
但是为什么下面的代码没有显示错误,因为最终值为i
4 并且arr[3]
是 的最高索引arr
?
为什么i
in没有arr[i]
链接到i
for 循环中声明的:var i = 0
? 这个问题的重点是理解概念而不是获得解决方案
var arr = [1, 2, 3, 4];
for (var i = 0; i<arr.length; i++){
console.log(arr[i])
}
与此相比,输出显示i
(即3)的最终值三倍。我知道let
应该在这里使用
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
解决方案
在第一个片段中,最大值为 4,但最大数组索引为 3 由于您的循环使用数组索引长度作为最大值,因此它不会超出最大索引。
要理解第二个示例,您需要了解 和 之间的var
区别let
。
最基本的解释是var
它的直接函数体(在你的情况下,在循环之外,与数组for
相同的范围),而在外壳内(循环内),它基本上会在循环的每次迭代中创建一个新变量,同时重用相同的变量。funcs
let
for
var
推荐阅读
- ios - App Center iOS 构建无法验证完整性
- c# - C#基本程序中的乘法
- python-3.x - tensorflow 函数使用其范围之外的变量
- c++ - 动态分配的二维数组中使用的用户定义类型
- python - Numpy:在两个不同长度的数组上成对应用函数
- python - 如何解决 CMake 错误:找不到“boost_python3”提供的包配置文件
- java - 在 Hazelcast jet 中,我们如何将 IList 存储到普通列表中,因为我必须在响应中发送它?
- c# - 连接到 HPC 调度程序时如何以编程方式设置用户密码凭据
- android - 在 Surface TextureView 上叠加动态 FPS
- regex - 为具有两个给定姓氏的人过滤 Airtable 数据库