JS的本质是单线程的。这点区别于JAVA的两个线程并发

但是,平时的JS,确实是同时运行很多任务,这又是怎么回事????

First,js的代码分为两种。同步代码和异步代码。

console.log(1)
console.log(1)
console.log(1)

这就是典型的同步代码,编写顺序就是执行顺序。

js引擎的主线程负责执行代码,由于只有这样一个线程,执行当然是同步的,即按照顺序来。

另外,还有一个叫做任务队列的东西,所有的异步代码都是从队列当中来。

通过上图我们就可以发现,JS根本不可能同时执行两个任务,本质上还是单线程的。

在JS中,所谓的异步分为三种:

第一,鼠标的键盘事件触发,例如onclick,onkeydown等等

第二,网络的事件触发,例如onload,onerror等等

第三,定时器,例如setTimeout,setInterval

因为这些任务的发生都不是发生在当下,而是过一段事件以后再执行。因此时间不可控。简单的就是说,你不能让因为5秒后要执行一个函数,就让主线程闲置5秒什么都不干吧!所以你只能继续执行后续的同步代码。而当你单击鼠标或滚动窗口时,主线程可能正在执行其他的任务,忙着呢!没有功夫处理,因此,事件触发线程就负责来接收这个事件,并把要执行的任务暂时保存在队列当中。等主线程把手里的同步代码执行完成后,就立刻会向任务队列提取最新的任务。

这也就解释了为什么我们总把JS的异步函数叫做回调了,因为真的不是马上执行,而是回头再调。

我们看一个简单的例子:

setTimeout("console.log(2)",0)
console.log(1)

  反复执行这段代码,都是先打印1,后打印2

因为setTimeout是一个异步的任务,第二参数真正的含义是在0毫秒之后,将代码插入到队列中,而不是在0毫秒之后执行。

当插入任务队列后,主线程会继续执行后续的代码,也就是打印结果1,如果此时的当前的同步代码已经执行完毕,则主线程立刻会从任务队列中取出最新的任务执行。再打印出j结果2。

平时我们使用定时器,时间上往往不准确,就是因为在加入任务队列时。前面可能有很多任务在排队,你明明写了延迟80ms,可是却等了100ms才出现了结果。

同时我们也理解了,为什么setInterval的事件间隔不能设置为0,一般情况下浏览器允许的最小值为16ms,因为如果你设置了0的话,对于浏览器来说,压力简直太大了,定时器触发线程会玩命的往队列中插入任务,而不是完成一个在插入一个。

我们再看一个ajax的例子

var req = new XMLHttpRequest();
req.open("get","http://XXXXXXXXXXX");
req.onload = function(){................}
req.send();

  

这里的send和onload是可以交换顺序的,因为send是一个异步的方法

。。。。。。。。。。未完待续

最新文章

  1. maven archetype二三事
  2. java7
  3. 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest
  4. 怎么评价Facebook的Relay框架?Meteor.js 是什么?
  5. Android——PULL解析XML
  6. 在没安装OFFICE的服务器SSIS中进行EXCEL的ETL操作!
  7. Git 远程操作详解
  8. [python]Python操作MySQL
  9. 如何写mysql的定时任务
  10. 创办支持多种屏幕尺寸的Android应用
  11. java.sql.SQLException: ORA-00911: 无效字符 解决方案
  12. 【C# -- OpenCV】Emgu CV 第一个实例
  13. POJ 3414--Pots(BFS+回溯路径)
  14. Dockerfile 最佳实践
  15. 对scanf和printf的研究!!
  16. 中标麒麟(linux)下Qt调用python数据转换
  17. url.openconnection() 设置超时时间
  18. ABP框架系列之五:(Unit Of Work-工作单元)
  19. 洗礼灵魂,修炼python(24)--自定义函数(5)—匿名函数lambda
  20. Cannot detect Web Project version. Please specify version of Web Project through Maven project property <webVersion>. E.g.: <properties> <webVersion>3.0</webVersion> </properties>

热门文章

  1. 【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)
  2. 【iOS系列】-oc中的集合类
  3. 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证
  4. 【hadoop】ssh localhost 免密码登陆(图解)
  5. C 编程中fseek、ftell的用法总结
  6. 异步编程错误处理 ERROR HANDLING
  7. go---weichart个人对Golang中并发理解
  8. MARGIN-BEFORE MARGIN-AFTER MARGIN-START MARGIN-END
  9. POJ - 3308 Paratroopers(最大流)
  10. C++实现二叉树(建树,前序,中序,后序)递归和非递归实现