js基础进阶--关于setTimeout的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn
先热身
看看下面的额代码会打印出什么?
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 100);
}
上面的结果是 5 5 5 5 5
我对上面的代码的理解是:
setTimeout是一个注册事件,当for循环遇见他时,会先注册这个事件,而不会去触发此事件,for循环的时间很短,所以当100毫秒后触发打印事件时,此时的i已经变为5,所以会打印出5个5;
那么上面的额代码我们改如何修改才能打印出0~4呢?
for(var i = 0; i < 5; i++) {
(function(k){
setTimeout(function() {
console.log(k);
}, 100);
})(i);
}
没错,上面的代码可以打印出我们想要的结果,他的结果为0~4,可是为什么呢?
我们所采用的解决方案是闭包,闭包可以延长其私有变量的生命周期,意思就是内部私有变量和函数保存下来,一直在内存中,之后到你用时他再给你
那么我们可以再把上面的题目延伸一下
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i + ' ');
},0);
}
console.log(0);
//请看这段代码,我在for循环后面加了段代码,而且把延时器事件的触发时间改为了0,请先想想结果会是什么?
可能有会两种想法
第一种为:5 5 5 5 5 0;
第二种结果为: 0 5 5 5 5 5;
那么哪一种结果是正确的呢?
其实正确结果是第二种
那么为什么呢?因为setTimeout是异步的(是注册事件),他会先把函数注册到事件队列当中,等待主程序走完,然后再被调用。所以答案为第二种;
我的github资源地址:https://github.com/js基础进阶--关于setTimeout的思考.md
我的个人博客地址:http://www.xiaolongwu.cn
我的博客园地址:http://www.cnblogs.com/wuxiaolong555
我的CSDN博客地址:https://blog.csdn.net/wxl1555
如果您对我的博客内容有疑惑或质疑的地方,请在下方评论区留言,或邮件给我,共同学习进步。
邮箱:wuxiaolong802@163.com
js基础进阶--关于setTimeout的思考的更多相关文章
- js基础进阶--图片上传时实现本地预览功能的原理
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...
- js基础进阶--关于Array.prototype.slice.call(arguments) 的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...
- js基础进阶--编码实用技巧(二)
我的个人博客:http://www.xiaolongwu.cn 接上篇文章 js编码的实用技巧(一) 5.合理利用||运算符 使用||可以作为参数之外的默认值,当第一个参数返回值为false时,那么第 ...
- js基础进阶--编的实用技巧(一)
我的个人博客:http://www.xiaolongwu.cn 在平时的开发中,编码技巧很重要,会让你少写很多代码,起到事倍功半的效果. 下面总结几种简单的技巧,大家共同学习一下 1. 利用+.-./ ...
- JavaScript进阶 - 第2章 你要懂的规则(JS基础语法)
第2章 你要懂的规则(JS基础语法) 2-1什么是变量 什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品 ...
- 网站开发进阶(十五)JS基础知识充电站
JS基础知识充电站 1.javascript alert弹出对话框时确定和取消两个按钮返回值? 用的不是alert对话框,是confirm confirm(str); 参数str:你要说的话或问题: ...
- js基础查漏补缺(更新)
js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...
- js基础梳理-关于this常见指向问题的分析
首先,依然回顾<js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?>中的 3.执行上下文的生命周期 3.1 创建阶段 生成变量对象(Variable object, ...
- 前端工程师面试问题归纳(一、问答类html/css/js基础)
一.参考资源 1.前端面试题及答案整理(一) 2.2017年前端面试题整理汇总100题 3.2018最新Web前端经典面试试题及答案 4.[javascript常见面试题]常见前端面试题及答案 5.W ...
随机推荐
- 如何运行 rpcz python example
试着运行 rpcz-python 的 example.过程记录如下.假设protobuf-py已经按照protobuf的安装说明安装了.发现 protobuf-2.5.0版的python包是pytho ...
- nginx 的编译参数详解
内容有些多,一眼看来难免头昏脑胀,但坚持看完,相信你一定会有所收获. nginx参数: --prefix= 指向安装目录 --sbin-path 指向(执行)程序文件(nginx) --conf-pa ...
- Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!
Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...
- R.java文件介绍
HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public static final ...
- HDTV(1920x1080)码率和视频质量关系的研究 1 (前期准备)
Hans Hoffmann等人在论文<Studies on the Bit Rate Requirements for a HDTV Format With 1920 x 1080 pixel ...
- 不错的东西: AutoMapper
详细信息可阅读原文:http://csharppulse.blogspot.in/2013/08/crud-operations-using-automapper-in-c_381.html 这东西可 ...
- 关于hashCode与equals
首先我得说明,在我们自己写得类中你可以复写这两个方法,此时从语法的角度来说,他们没关系. 在object中 public native int hashCode(); public boolean e ...
- eclipse-整合struts和spring-maven
maven配置文件 <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> < ...
- 将html5项目部署到tomcat上,并实现安卓手机访问
最近在使用Webstorm开发项目中前端相关的内容,但是涉及到使用ajax技术,不能够跨域访问相关json文件和服务,需要将前端代码部署到tomcat服务器上.但是,如果通过手动拷贝的方式,太过于复杂 ...
- Android热补丁技术—dexposed原理简析(手机淘宝采用方案)
上篇文章<Android无线开发的几种常用技术>我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到dalvik虚拟机和android ...