为什么不是0,1,2,3,4?setTimeout的奇怪问题
时间:2022-04-27
本文章向大家介绍为什么不是0,1,2,3,4?setTimeout的奇怪问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
网上看到这样一个题目:
for(let i=0;i<5;i++){
setTimeout(function(){alert(i)},0)
}
它输出的顺序并不是0,1,2,3,4,也不是固定的某一个顺序的数字,而是几乎每一次执行时的输出数字都不一样。
为什么是这样呢?
其实这里有三个关键点,
1、let,它声明了一个块级作用域;
2、alert,它引起了js的阻塞;
3、setTimeout添加到js队列;
简单的讲,
1、js中没有任何可以立即执行的代码,它们都是需要被添加到队列中,然后进程空闲了再来执行。
2、setTimeout并不是指定了间隔时间就一定会按指定时间执行。它只是说“在指定时间之后,加入队列,等待执行”。至于什么时候执行,要看进程队列的空闲程度。
3、alert()它会阻塞js的执行,此时js进程是暂停的。
4、题目中使用的是let,这相当于是使用闭包的方式来传入值。如果是var,那么就是直接执行完i=5之后再执行alert了。
这个题目很简单,但包含了几个关键的知识点,我把这个题目添加到了先行者旗下的js问答小组之中,
在我收到的回复邮件中,这个同学的回答很靠谱,
- ASP VNext 开源服务容错处理库Polly使用文档
- Node.js力破江苏网警刑侦科推理试题
- Python之dict(或对象)与json之间的互相转化
- datetime.date(2014, 4, 25) is not JSON serializable
- Linux下PAM模块学习总结
- 统计文件中出现的单词次数
- EF批量操作数据与缓存扩展框架
- 前端面试题:JS中的let和var的区别
- 虚拟机字节码执行引擎
- 快速傅里叶变换(FFT)详解
- SQLServer 数据库镜像+复制切换方案
- Handler源码分析
- STM32-对芯片启动读保护,实现加密(详解)
- Django+xadmin打造在线教育平台(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法