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 的理解的更多相关文章

  1. JavaScript下的setTimeout(fn,0)意味着什么?

    近期在研究异步编程的我对于setTimeout之类的东西异常敏感.在SegmentFault上看到了一个问题<关于SetTimeout时间设为0时>:提问者读了一篇文章,原文解释setTi ...

  2. 定时器相关 setTimeout setInterval 函数节流

    这个问题也是在参加百度的前端技术学院中遇到的 任务中需要用js实现动画  导师给的评价中setInterval会导致bug 当时不理解   下面把自己学习的过程分享出来 再次理解单线程   老是说js ...

  3. setTimeOut和闭包

    掘金上看到一个setTimeout与循环闭包的思考题.拿过来看了下,一方面了解settimeout的运行机制,还有就是js闭包的特性.关于闭包,有如下解释: 在这里写一点我对闭包的理解.理解闭包的关键 ...

  4. JavaScript运行机制与setTimeout

    前段时间,老板交给了我一个任务:通过setTimeout来延后网站某些复杂资源的请求.正好借此机会,将JavaScript运行机制和setTimeout重新认真思考一遍,并将我对它们的理解整理如下. ...

  5. 前端基础进阶(六)-大厂面试题问题:循环闭包与setTimeout

    我在上一篇闭包的文章中留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i = 1; i <= ...

  6. 附件1:setTimeout与闭包

    我在详细图解作用域链与闭包一文中的结尾留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i=1; i ...

  7. call,apply,bind

    一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法 ...

  8. javascript中的一些核心知识点以及需要注意的地方

    前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...

  9. JS异步阻塞的迷思

    还是百度前端技术学院的“任务十九”可视化排序算法的题,在写出快速排序算法之后,要求用动画的形式把这个排序过程呈现出来.排序过程在CPU里不过是瞬间的事,但要转换成“缓慢的”动画效果给人类看,就不得不把 ...

随机推荐

  1. JavaScript 数组 遍历方法 map( ) 和 forEach( )

    let arr = [1, 3, 7, 6, 9]; 不用知道元素的个数,即不用设置开始下标和结束下标. 1:forEach( )会把数组中的每个值进行操作,没有返回值,undefined let j ...

  2. vue标签内循环数据逗号分隔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [AIR] NativeExtension在IOS下的开发实例 --- Flex库项目的创建(二)

    来源:http://bbs.9ria.com/thread-102038-1-1.html 上一章,我已经介绍了如果创建IOS库文件,并定义了两个方法ShowIconBadageNumber和Init ...

  4. 整合91平台接入的ANE

    来源:http://www.swfdiy.com/?p=1328 91平台接入的SDK只有objectC版和java版, 现在如果要在AIR里使用SDK,只能编写ANE整合进来. 91SDK = 几个 ...

  5. Arm存储器

    Arm可以引出27根地址线,只能实现128MB的寻址,那么要如何实现1GB的寻址呢?答案就是使用nGCS片选线,nGCSx为低电平为选中相应的外接设备.一共八根片选线,也就是bank1,bank2-以 ...

  6. Oracle 多表插入

    多表插入 作用:一条INSERT语句可以完成向多张表的插入任务(Multitable insert).有两种形式:insert all与insert first,准备测试环境:1.创建表T并初始化测试 ...

  7. 阿里云SOP

    阿里云SOP 摘要 注册阿里云账号. 领取及配置ECS. 领取及配置RDS. 部署网站. 注册阿里云账号 在主页点击注册 填入相应的信息 领取及配置ECS 注册后领取免费的ECS,RDS. 打开控制台 ...

  8. 一:MySQL系列之基本介绍(一)

    本篇主要介绍关于MySQL数据的基本知识,包括数据存储的变化,什么是MySQL以及其有什么优点.以及什么是RDBMS概念性知识等,以及关于MySQL语句的SOL的基本用法: 一.数据库 数据库,顾名思 ...

  9. python接口自动化18-multipart/form-data上传多个附件

    前言 reuqests上传一张图片到服务器,前面已经介绍过了,那么如何在提交BUG的时候,上传附件呢? 上传附件的时候,文件的name参数名称是一样的,python里面key是不可以重复的,又如何处理 ...

  10. keepalived,tomcat,memcache

    1.Nginx+Keepalived实现站点高可用 linux cluster类型 LB:nginx负载,varnish(director module)haproxy,lvs HA:keepaliv ...