这里主要是结合Event Loop来谈JS代码是如何运行的。 事件循环对于我们平时开发可以说是特别重要,可以让我们写出更好的代码。

到这里相信我们已经知道了JS引擎是单线程,而且这里会用到前面说的的几个概念:(如果不是很理解,可以看看前几节)

  • JS引擎线程 【执行js代码】

  • 事件触发线程【轮训】

  • 定时触发器线程【倒计时结束了,要执行回调方法了】

然后再理解一个概念:

  • JS分为同步任务和异步任务

  • 同步任务都在主线程上执行,形成一个执行栈 【执行栈后面咱们会详细的介绍,栈的特点是后进先出】

  • 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件【回调方法】。

  • 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。

看到这里,应该就可以理解了:为什么有时候setTimeout推入的事件不能准时执行?因为可能在它推入到事件列表时,主线程还不空闲,正在执行其它代码,
所以自然有误差。

再重复一下:

  • 主线程运行时会产生执行栈,

栈中的代码调用某些api时,它们会在事件队列中添加各种事件(当满足触发条件后,如ajax请求完毕)

  • 而栈中的代码执行完毕,就会读取事件队列中的事件,去执行那些回调方法。

  • 如此循环

  • 注意,总是要等待栈中的代码执行完毕后才会去读取事件队列中的事件

最新文章

  1. 【历史】JavaScript和Java没啥关系!————JavaScript简史
  2. 给div加上背景图片
  3. 前端学习 第二弹: JavaScript中的一些函数与对象(1)
  4. C#语句1:选择语句二(switch break)
  5. SQL Server 存储引擎-剖析Forwarded Records
  6. OC基础(1)
  7. 获取iframe中的元素
  8. JAVA简单的UI设计
  9. AndroidUI的组成部分GridView
  10. jvm内存查看与分析工具
  11. python进行爬虫
  12. php面试流程
  13. Oracle中Inventory目录作用以及如何重建此目录 oraInst.loc 文件
  14. macos下安装oh-my-zsh和zsh-autosuggestion
  15. 轻松学SQL Server数据库
  16. System.Windows.Freezable 在未被引用的程序集中定义
  17. loadrunner添加变量检查点
  18. BIEE物理业务层编辑之后发布路径
  19. C++ XML 序列化器
  20. github提交代码不用输入账号密码的解决方案

热门文章

  1. mysql语句插入前判断数据是否重复
  2. python入门练习之如何连接数据库
  3. Android中直接打开高德APP进行导航
  4. Delphi导出word
  5. SpringMVC的数据回现
  6. Python基础(5) - 文件
  7. vue基础知识之vue-resource/axios
  8. 解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题
  9. spring boot 定时任务
  10. sun.misc.unsafe