首先要了解这里代码执行顺序

for循环同步;setTimeout异步;

js在执行代码的过程中,碰到同步代码会依次执行,碰到异步代码就会将其放入任务队列中进行等待,当同步代码执行完毕后再开始执行异步代码;

然后看下面:

let声明

for(let i=1; i<=5; i++){
  setTimeout(function(){console.log(i)})
}
// 1 2 3 4 5

  

let 是块级作用域,一个{} 就是一个区块,而且在每一块内部都不能有重复声明的变量

上面这个循环遍历执行了5次,相当于有五个块作用域,每个块作用域里面的都定义了一个叫 i 的变量。值分别是1 2 3 4 5

所以最后执行setTimeout的时候会从当前作用域(块作用域)内寻找变量 i ,所以最终结果是1 2 3 4 5

var声明

for(var i=1; i<=5; i++){
  setTimeout(function(){console.log(i)})
}
// 6 6 6 6 6

  

var是函数作用域可以重复声明并覆盖值,在当前这个作用域下,变量 i 在循环结束后值更新为6,再执行setTimeout时,setTimeout所在的作用域里 i 已经是6了。

搜索

复制

最新文章

  1. window.onload 和 DOMContentLoaded区别及如何判断dom是否加载完毕
  2. Ring0打开其他设备对象三种方式整理
  3. Java学习笔记 07 接口、继承与多态
  4. 利用FFmpeg生成视频的缩略视频 v8.3
  5. 图解Android - System Service 概论 和 Android GUI 系统
  6. Rest风格WEB服务(Rest Style Web Service)的真相
  7. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)【转】
  8. 分布式缓存BeIT Memcached简介
  9. SQL Server 2008 Values 新用途
  10. string.Format字符串格式说明
  11. epoll 中EPOLLIN 和 EPOLLOUT
  12. JDK PATH 和 CLASSPATH环境变量的作用及其配置
  13. Ajax应用常见的HTTP ContentType设置
  14. ubuntu 下安装sublime
  15. excel转html 实现在线预览
  16. 校验ISBN的方法
  17. H5动画
  18. Oracle EBS各个模块日志收集的方法
  19. Python之shutil模块(复制移动文件)
  20. ubuntu开机自动启动服务

热门文章

  1. java的饿汉和懒汉设计模式
  2. 数值分析——插值(一)、Runge现象
  3. [python] 基于wordcloud库绘制词云图
  4. [OpenCV实战]43 使用OpenCV进行背景分割
  5. Asp-Net-Core-搭建ELK日志平台-Docker-Compose版本
  6. DML_添加数据-DML_删除数据
  7. Node.js+Koa2+TypeScript技术概览
  8. 同类型芯片资源对比-CH32x芯片快速应用说明
  9. 快速上手python的简单web框架flask
  10. 文盘Rust -- rust 连接云上数仓 starwift