setTimeout 的理解
setTimeout,延迟一段时间执行代码。
setTimeout(func,0),这代码的作用并不是简单地和直接调用func一个效果:
1:动态往DOM树中插入元素,然后立刻操作这个元素(选择文本框文本,改变select的index)。
2:因为浏览器单线程,js引擎和渲染引擎必须是顺序执行。(比如点击一个按钮,浏览器会先改变按钮的状态(重绘),然后才执行js(js引擎))
3:所以向DOM插入元素再立刻操作这个DOM,很可能这DOM还没重绘完成,因此操作无效。
4:所以setTimeout(func,0) 可以解决(setTimeout 会等重绘完成再执行代码。)
---------------以上部分是结果,下边是原理----------------------------------------------------------------------
深入思考:
5:setTimeout(func,0)是延迟0ms执行,也就是立即执行,为什么还是在重绘之后呢。重绘肯定超过0ms啊。
6:因为Javascript的单线程异步模式。
7:参考John Resig 的 《how javascript Timers work》
-------------------以下是对此文章理解-----------------------------------------------------------------------------

--蓝色的为js块。
--右边的数字是事件。
--左边数字是时间轴。
--问题是浏览器的判断。
步骤解析:
1:第一个js块中,两个10ms的timer被初始化(一个setTimeout 一个setInterval),鼠标点击了(鼠标点击事件的事件处理函数也要排队等第一个js块执行完再处理),
2:第一个js块执行完,浏览器问谁在等执行?(鼠标点击事件和timer)
3:执行鼠标点击事件,timer继续等待。
4:在执行鼠标点击事件时,10ms的interval触发了(毫无例外的继续排队,想立即执行不存在的)
5:事件处理函数执行完毕,timer开始执行,这时候interval 又触发了。。(这次的interval被抛弃了dropped)
6:timer执行完毕,第一个interval执行,然后第三个interval触发,在其自身执行过程中,自身也可以被触发。
7:最后没什么排队的,所有interval立刻执行。
然后setTimeout 和 setInterval的区别
setTimeout(function(){
setTimeout(arguments.callee,10);
},10);
setInterval(function(){
},10);
这两个代码看着效果一样,其实区别很大。setTimeout总是会在其回调函数执行后延迟10ms(或者更多,不会更少)。但是setInterval总是10ms执行一次而不管它的回调函数执行多久。
如果intervals的回调执行时间比你给的delay还要长,那么他们会连在一起执行。
----------------------------------下边说说settimeout中的this---------------------------------------------------
setTimeout的this被指向全局作用域
var 0 = {
a:"a",
b: function(){
setTimeout(function(){
console.log(this.a);
},1000);
}
}
o.b();// undefined
解决办法是:
var o={
a:"a",
b:function(){
var that = this;
setTimeout(function(){
console.log(that.a);
},1000);
}
}
setTimeout 的理解的更多相关文章
- JavaScript下的setTimeout(fn,0)意味着什么?
近期在研究异步编程的我对于setTimeout之类的东西异常敏感.在SegmentFault上看到了一个问题<关于SetTimeout时间设为0时>:提问者读了一篇文章,原文解释setTi ...
- 定时器相关 setTimeout setInterval 函数节流
这个问题也是在参加百度的前端技术学院中遇到的 任务中需要用js实现动画 导师给的评价中setInterval会导致bug 当时不理解 下面把自己学习的过程分享出来 再次理解单线程 老是说js ...
- setTimeOut和闭包
掘金上看到一个setTimeout与循环闭包的思考题.拿过来看了下,一方面了解settimeout的运行机制,还有就是js闭包的特性.关于闭包,有如下解释: 在这里写一点我对闭包的理解.理解闭包的关键 ...
- JavaScript运行机制与setTimeout
前段时间,老板交给了我一个任务:通过setTimeout来延后网站某些复杂资源的请求.正好借此机会,将JavaScript运行机制和setTimeout重新认真思考一遍,并将我对它们的理解整理如下. ...
- 前端基础进阶(六)-大厂面试题问题:循环闭包与setTimeout
我在上一篇闭包的文章中留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i = 1; i <= ...
- 附件1:setTimeout与闭包
我在详细图解作用域链与闭包一文中的结尾留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i=1; i ...
- call,apply,bind
一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法 ...
- javascript中的一些核心知识点以及需要注意的地方
前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...
- JS异步阻塞的迷思
还是百度前端技术学院的“任务十九”可视化排序算法的题,在写出快速排序算法之后,要求用动画的形式把这个排序过程呈现出来.排序过程在CPU里不过是瞬间的事,但要转换成“缓慢的”动画效果给人类看,就不得不把 ...
随机推荐
- Selenium文件上传
转自:https://www.cnblogs.com/miaojjblog/p/9679915.html Web上本地上传图片,弹出的框Selenium是无法识别的,也就是说,selenium本身没有 ...
- 在Xcode4 中将iPhone使用的xib转换成iPad使用的xib
来源:http://blog.3snews.net/space.php?uid=6188&do=blog&id=64200 http://www.giser.net/?p=982 1 ...
- Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python3 get-pip.py 输入两行命令即可
- Linux的网络不通流程
a:xshell连不上的问题第一步:检查网络适配器,是否禁用vmware的虚拟机网卡第二步:检查vmware net8的地址是否为10.0.0.1第三步:检查系统的vmware服务是否启动第四步:检查 ...
- O - Can you find it?(二分查找)
O - Can you find it? Time Limit:3000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64 ...
- kubernetes-使用Calico配置NetworkPolicy
安装网络插件Calico 先下载好yml,因为我的虚拟机地址(192.168.17.180)在192.168.0.0/16网段中 所以要修改 wget https://docs.projectcali ...
- 大数据技术之Hadoop3.1.2版本伪分布式部署
大数据技术之Hadoop3.1.2版本伪分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinzh ...
- (Linux基础学习)第七章:echo命令
第1节:简单说明功能:显示字符语法:echo [-neE][字符串]说明:echo会将输入的字符串送往标准输出.输出的字符串之间以空白字符隔开,并在最后加上换行号选项:-E(默认)不支持\解释功能-n ...
- Linux中快速对字符串进行加密
1)进行base64的加密和解密 [root@VM_0_10_centos opt]# echo hello |base64aGVsbG8K[root@VM_0_10_centos opt]# ech ...
- Windows窗体控件实现内容拖放(DragDrop)功能
一.将控件内容拖到其他控件 在开发过程中,经常会有这样的要求,拖动一个控件的数据到另外一个控件中.例如将其中一个ListBox中的数据拖到另一个ListBox中.或者将DataGridView中的数据 ...