setTimeout与setInterval执行

  首先我们看一下以下代码打印结果

1
2
3
4
5
6
7
console.log(1);
setTimeout(function() { console.log(2); },100)
setTimeout(function() { console.log(3); },50)
console.log(4);

  打印结果是 1、4、3、2,你可能觉得理所应当,那我们再看下下面这个例子

1
2
3
4
5
console.log(1);
setTimeout(function() { console.log(2); },0)
console.log(3);

  这次的结果又会是什么呢?

  1、3、2,不是1、2、3。到这里你可能会有疑惑了,明明定时器设置的时间为0,而且浏览器解析js是按照从上到下执行的,应该是1、2、3才对啊?

  到这里我们要提一下浏览器的线程问题。

  与js相关的浏览器线程有三个(注意:js解析是单线程) - js代码执行线程( 主线程 ) - UI渲染线程 - 事件循环线程

  其中js代码执行线程与UI渲染线程两者是互斥的,也就是说js代码执行线程运行的时候,UI渲染线程会停止工作,这样做也是为了防止js中的DOM操作会导致两线程冲突;而事件循环线程比较特殊,接下来会根据setTimerout的执行过程进行讲解其作用。

  回到上面的第一道题目

1
2
3
4
5
6
7
console.log(1);
setTimeout(function() { console.log(2); },100)
setTimeout(function() { console.log(3); },50)
console.log(4); 

  执行过程:

  1. js主线程运行,遇到console.log(1),直接运行,在控制台输出结果;

  2. 主线程继续运行,然后遇到第一个setTimeout,接着setTimeout中的回调函数会被放入到一个事件队列中(这里的事件队里可以想象成一个备忘录,里面记录的全是一些需要做而未做的事);

  3. 遇到第二个setTimeout,其中的回调函数依然被加入到事件队列中;

  4. 执行console.log(4),到这里主线程的任务全部执行完毕,除了setTimeout里面的回调函数;

  5. 这个时候,我们还未说明的事件循环线程开始工作,它会去循环遍历事件队列(也就是我们的备忘录),如果事件队列中有回调函数,它就会将事件队列中的回调函数重新交给主线程;

  6. 主线程收到回调函数,然后开始执行函数体。(这里要注意,因为两个setTimeout本身有执行时间,所以在这里的时候就会根据时间的长短按顺序执行啦。)

  setInterval原理与之相同,不作另说。

  总的来说,setTimeout与setInterval的执行会等到主线程的所有任务全部执行后,才会再执行其中的回调函数,所以在使用它们的时候也要注意,特别是在主线程中有特别耗时的任务的时候,两种定时器会被不可预测的延后。

  讲到这里,大家有没有想到什么呢?

  恩,就是异步,setTimeout的执行有没有一点异步的感觉呢?但又因为它必须是等到主线程全部执行完才会执行,所以可以称之为伪异步。

  说到异步,我们还会想到AJAX,都说AJAX是异步,但是它异步的原理想必还不清楚的你应该有点兴趣了解的。

  异步:简单说就是在处理某一件事的时候还可以去做别的事,比如:你在银行取号后等待取钱,在等待的过程中你还可以玩手机,和别人聊天等等,这个过程就是异步的。

AJAX 异步的原理

  1. 发送一个AJAX请求的时候,浏览器会有一个专门的线程来进行该任务;

  2. 而在AJAX中也是有回调函数的,比如请求成功后的回调,失败后的回调,这些回调函数与setTimeout中的回调一样会被推入到事件队列中;

  3. 浏览器接会再次提供一个县城接收AJAX请求返回的数据;

  4. 事件循环线程这时候知道事件队列中AJAX的回调函数能够被执行了,遍历事件队列,将其中的回调函数交回给js主线程;

  5. 主线程执行AJAX回调函数内部代码。

  总的说来,AJAX的请求不会干扰到主线程任务的执行,它有自己专供的线程来处理其任务,就像是浏览器的亲儿子~~~

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1924616如需转载请自行联系原作者

sshpp

JavaScript———从setTimeout与setInterval到AJAX异步相关推荐

  1. 关于Javascript 中 setTimeout和setInterval的总结和思考

    1. JavaScript 单线程 我们通常说,javascript是单线程,指的是解释和执行js代码的引擎是单线程. 而对于浏览器来说,浏览器并不是单线程的,浏览器的线程通常包括:渲染引擎线程(负责 ...

  2. Javascript的setTimeOut()和setInterval()的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  3. JavaScript之setTimeout与setInterval的用法与区别

    }, 1000) } 那为啥使用let就可以了呢: 其实使用let之后,也没有改变执行机制,仍然是最后执行的alert(),但是let可以在每一次把更新的变量i传进函数体内,也就是每一次的i加1之后, ...

  4. ajax异步执行调用什么机制,大白话讲解JavaScript 执行机制,一看就懂

    JavaScript的运行机制 1.JavaScript为什么是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程 ...

  5. JavaScript 中的 setTimeout 和 setInterval 方法

    有时您不希望函数立即运行.您希望它重新执行,甚至在特定时间间隔后重复运行.JavaScript 为我们提供了两种实现方法: setTimeout 和 setInterval.下面,我们将来理解这两个方 ...

  6. js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...

    javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...

  7. [转] 为什么javascript是单线程的却能让AJAX异步调用?

    为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的? function foo() {console.log( 'first' );se ...

  8. php原生的异步请求,原生JavaScript实现Ajax异步请求

    ajax现在是一种非常流行的技术,现在虽然可以利用JQuery或者一些第三方插件甚至微软提供的一些控件可以方面的实现ajax功能,但是明白其原理也是非常重要的,下面是来使用纯javascript实现获 ...

  9. 重新认识javascript的settimeout和异步

    今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案.但是原因到底是什么呢?自己一时也说不太清楚,反正感觉就是一个死循环造成 ...

最新文章

  1. ef mysql 插件_EF Core 插件 —— ToSql
  2. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。
  3. linux修改mysql默认大小写配置,linux下设置mysql不区分大小写
  4. 邮件办公系统Exchange
  5. appcompat_v7 引起的新建Android工程编译不过的问题 (转载)
  6. 4+5的值是python_Python基础:数据类型-数字(5)
  7. HDU 2115 -I Love This Game
  8. 检查两个列表在Java中是否相等
  9. 使用Spring AOP实现活动记录模式
  10. 单体、分布式、微服务、Serverless软件架构一览
  11. .net core 常见设计模式-IChangeToken
  12. 在python中一个子类只能有一个父类吗_在Python中,子类可以与父类在不同的文件中吗?...
  13. 逼急了自己人都坑,腾讯内部上演吃鸡大战
  14. 基于 FPGA 的智力抢答器设计
  15. 7 vsphere 分配许可_外企公司员工Office 365权限是否已分配
  16. InDesign 软件教程,如何自定义工作区?
  17. kettle的行转列主键用法详解(正规化 宽表到窄表的过程)
  18. 使用SQLyog创建表
  19. python pyd_python项目(.pyd或者.so)代码加密
  20. 小甲鱼Python第十九讲(函数,我的地盘听我的)

热门文章

  1. leetcode算法题--多边形三角剖分的最低得分★
  2. Android怎样保证一个线程最多仅仅能有一个Looper?
  3. Linux操作系统下查看硬件信息的命令总结
  4. APP压力測试新手教程
  5. 打印九九口诀表(15)
  6. 袁晖:C2B汽车电商模式创新
  7. jquery easy ui 1.3.4 数据表格(DataGrid)(8)
  8. 修改注册表添加信任站点及启用Activex控件(转载)
  9. Subsonic使用中
  10. BZOJ 1046: [HAOI2007]上升序列(LIS)