参考资料:《JavaScript高级程序设计》
 
在 let 出现之前,for 循环定义的迭代变量会渗透到循环体外部:
for (var i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // 5
改成使用 let 之后,这个问题就消失了,因为迭代变量的作用域仅限于 for 循环块内部:
for (let i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // ReferenceError: i 没有定义
在使用 var 的时候,最常见的问题就是对迭代变量的奇特声明和修改:
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 你可能以为会输出 0、1、2、3、4
// 实际上会输出 5、5、5、5、5
 
之所以会这样,是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。
在之后执行超时逻辑时,所有的 i 都是同一个变量,因而输出的都是同一个最终值。
而在使用 let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。
每个 setTimeout 引用的都是不同的变量实例,所以 console.log 输出的是我们期望的值,也就是循
环执行过程中每个迭代变量的值。
 
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
 
// 会输出 0、1、2、3、4
 
这种每次迭代声明一个独立变量实例的行为适用于所有风格的 for 循环,包括 for-in 和 for-of
循环。

最新文章

  1. C# 匿名对象随笔
  2. map的四种遍历方式
  3. HDU 5690:2016&quot;百度之星&quot; - 初赛 All X
  4. 实验五 含有控制信号的计数器VHDL设计
  5. Sqlserver日期函数应用
  6. discuz特殊主题插件开发步骤和犯的愚蠢错误
  7. 为设计师准备的 20 个新的免费 PSD 模板
  8. hql语句理解2
  9. Java Language and Virtual Machine Specifications
  10. django admin site配置(二)
  11. html5有什么布局标签
  12. ZeroBraneStudio之支持GBK文件编码
  13. sublime text3 插件配置
  14. acdream暴力专场中的优美暴力
  15. (转)ubuntu下如何查看软件安装目录以及安装版本
  16. 新浪云计算SAE部署代码过程
  17. MySQL巧用自定义函数进行查询优化
  18. mantisbt的配置与安装
  19. Linux~上部署.net MVC出现的问题与解决
  20. ORACLE数据库自动备份压缩的批处理脚本 rar 7z

热门文章

  1. 微服务分布式电商项目学习笔记(三)---- docker介绍安装以及使用docker安装软件(2020/7/10)
  2. 剑指offer-二叉树
  3. 决策树减支问题(优化)dfs减支问题
  4. MarkDown系列教程
  5. MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)
  6. 6个LED的控制
  7. Pycharm开发环境配置与调试
  8. go 虎牙爬取
  9. nginx安全: 配置http基本验证(Basic Auth)(nginx 1.18.0)
  10. Geoserver发布shp文件