从Event Loop谈JS的运行机制
2024-10-19 11:40:46
这里主要是结合Event Loop
来谈JS代码是如何运行的。 事件循环对于我们平时开发可以说是特别重要,可以让我们写出更好的代码。
到这里相信我们已经知道了JS引擎是单线程,而且这里会用到前面说的的几个概念:(如果不是很理解,可以看看前几节)
JS引擎线程 【执行js代码】
事件触发线程【轮训】
定时触发器线程【倒计时结束了,要执行回调方法了】
然后再理解一个概念:
JS分为同步任务和异步任务
同步任务都在主线程上执行,形成一个
执行栈 【执行栈后面咱们会详细的介绍,栈的特点是后进先出】
主线程之外,事件触发线程管理着一个
任务队列
,只要异步任务有了运行结果,就在任务队列
之中放置一个事件【回调方法】。一旦
执行栈
中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列
,将可运行的异步任务添加到可执行栈中,开始执行。
看到这里,应该就可以理解了:为什么有时候setTimeout推入的事件不能准时执行?因为可能在它推入到事件列表时,主线程还不空闲,正在执行其它代码,
所以自然有误差。
再重复一下:
主线程运行时会产生执行栈,
栈中的代码调用某些api时,它们会在事件队列中添加各种事件(当满足触发条件后,如ajax请求完毕)
而栈中的代码执行完毕,就会读取事件队列中的事件,去执行那些回调方法。
如此循环
注意,总是要等待栈中的代码执行完毕后才会去读取事件队列中的事件
最新文章
- 【历史】JavaScript和Java没啥关系!————JavaScript简史
- 给div加上背景图片
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
- C#语句1:选择语句二(switch break)
- SQL Server 存储引擎-剖析Forwarded Records
- OC基础(1)
- 获取iframe中的元素
- JAVA简单的UI设计
- AndroidUI的组成部分GridView
- jvm内存查看与分析工具
- python进行爬虫
- php面试流程
- Oracle中Inventory目录作用以及如何重建此目录 oraInst.loc 文件
- macos下安装oh-my-zsh和zsh-autosuggestion
- 轻松学SQL Server数据库
- System.Windows.Freezable 在未被引用的程序集中定义
- loadrunner添加变量检查点
- BIEE物理业务层编辑之后发布路径
- C++ XML 序列化器
- github提交代码不用输入账号密码的解决方案
热门文章
- mysql语句插入前判断数据是否重复
- python入门练习之如何连接数据库
- Android中直接打开高德APP进行导航
- Delphi导出word
- SpringMVC的数据回现
- Python基础(5) - 文件
- vue基础知识之vue-resource/axios
- 解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题
- spring boot 定时任务
- sun.misc.unsafe