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里不过是瞬间的事,但要转换成“缓慢的”动画效果给人类看,就不得不把 ...
随机推荐
- 【转载】 C#中List集合使用InsertRange方法在指定的位置插入另一个list集合
在C#的List集合操作过程中,如果在集合中的某个位置插入一个新的元素对象,可以使用Insert方法进行操作.其实List集合也提供了在特定的位置插入另一个集合,然后另一个集合的数据整个写入到当前集合 ...
- python多进程并发插入mysql数据
import pymysql import traceback from multiprocessing import Pool,Manager,cpu_count from multiprocess ...
- Centos 端口被占用,kill被占用的进程
1.yum install lsof 2.输入netstat -tln,查看系统当前所有被占用端口 3.根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4. 既然知道进程号了, ...
- Python——Str
在Python内存中,字符串是以unicode形式存储的. str格式,最常用的数据类型格式,分别有 (' ') 引号 ,(" ")双引号,(''' ''')三引号 开头和结尾的引 ...
- k8s pv无法删除问题
一般删除步骤为:先删pod再删pvc最后删pv 但是遇到pv始终处于“Terminating”状态,而且delete不掉.如下图: 解决方法: 直接删除k8s中的记录: kubectl patch p ...
- Keil、uVision、RealView、MDK、Keil C51之间的区别比较
我们要区别的概念:KEIL UVision,KEIL MDK,KEIL For ARM,RealView MDK,KEIL C51,KEIL C166,KEIL C251 从接触MCS-51单片机开始 ...
- go工程组织规范
go编码以workspace形式管理,一个workspace包含所有的Go编码,包含多个版本控制仓库(例如使用git管理的多个仓库).每个仓库包含多个包package,每个package是一个单独的路 ...
- CasPHP 便捷简单的 ThinkPHP 框架
便捷简单的 PHP 框架,自适应后台管理界面 Convenient and succinct(便捷的 简明的;言简意赅的) 核心框架:framework: 5.1.28助手函数:think-helpe ...
- 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
uber全球用户每天会产生500万条行程,保证数据的准确性至关重要.如果所有的数据都得到有效利用,t通过元数据和聚合的数据可以快速检测平台上的滥用行为,如垃圾邮件.虚假账户和付款欺诈等.放大正确的数据 ...
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...