setTimeout异步加载
2024-08-26 15:40:24
两道经典的面试题,直接上代码
for(var i=0; i<3; i++){
setTimeout(function(){
i+=i;
console.log(i);
},1000)
}
var i = 1;
console.log(i);
会输出什么呢?先想一想,记下答案。继续下一题
for(var i=0; i<3; i++){
setTimeout(function(){
i+=i;
console.log(i);
},1000)
}
console.log(i);
改动很少,结果却相差甚远。先公布正确答案,第一段代码输出:1,2,4,8; 第二段代码输出:3,6,12,24。
意不意外?刺不刺激?惊不惊喜?
【代码解析】
首先,不要被定时器干扰,误以为它有延迟才会导致这样的结果,你可以尝试把延迟改成“0”或者去掉不写,结果依然相同。
引入一个概念-->异步,脱离当前事件队列的处理程序,而且必须等到正常队列里的事件完成后才会执行。
再来分析以上代码,
第一个,看到setTimeout,就知道知道它会在代码块的for循环及最后一个console.log完成后才执行,而且执行三次。毫无疑问,会先输出1,此时 i 的值为 1,再开始执行setTimeout进程,分别输出2,4,8.
第二个,需要对闭包有一定理解,js中的for循环是不存在私有作用域的,所以for循环最后结束时 i = 3,然后再执行setTimeout,依次是6,12,24.
最新文章
- SDK接入(U8SDK)——SDK抽象层的设计
- 树形DP习题
- java 泛型接口示例
- js中的this中使用
- 漫谈Java虚拟机(JVM)
- PHP分页
- Java Web编程的主要组件技术——Struts的高级功能
- poj 1487 Single-Player Games
- 关于Git的stash命令
- Zend框架2入门(一) (转)
- .NET Reflector 8.3.3.115 官方最新版+注册机(强大的.NET反编译工具破解版)
- ubuntu14.04 下安装mysql5.6
- oracle数据库兼容mysql的差异写法
- tsung压力测试——tcp测试tsung.xml配置模版说明
- 小程序wxss和css3的区别
- lua continue实现
- 【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理
- JS 文本框格式化
- 第六次spring会议
- python全栈开发day20-类的三大特性继承、多态、封装
热门文章
- sql中 datediff的使用
- java多线程基本概述(二)——Thread的一些方法
- 如何用unity3d实现发送带附件的邮件
- Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)
- Block Token 原理分析
- [ext4]04 磁盘布局 - Meta Block Groups
- Java中多线程同步类 CountDownLatch
- TypeScript入门-枚举、类型推论
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
- LeetCode:36. Valid Sudoku,数独是否有效