当前位置: 首页 > news >正文

JavaScript的异步运行机制

----异步运行机制如下:

1.左右同步任务都在主线程上执行,形成一个执行栈

2.主线程值外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件

3.一旦执行栈中的所有同步任务执行完毕,系统会读取任务队列并将对应要执行的任务放到主线程中,主线程结束等待状态,进入执行栈,开始执行

(只要主线程空了,就会读取任务队列,这就是JavaScript运行机制,这个过程不断重复)

4.主线程重复以上步骤

 

 

----为什么JavaScript是单线程:

1.JavaScript一次只能做一件事,作为浏览器脚本语言,多个线程中进行的操作可能会造成冲突,所以JavaScript只能是单线程

 

----HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。在此之前,老版本的浏览器都将最短间隔设为10毫秒。另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常不会立即执行,而是每16毫秒执行一次。这时使用requestAnimationFrame()的效果要好于setTimeout()。

需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。

 

----

"任务队列"是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件。

"任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。

所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。

"任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。但是,由于存在后文提到的"定时器"功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程。

 

----JavaScript中没有任何代码时立即执行的,都是进程空闲时尽快执行

 

转载于:https://www.cnblogs.com/frontendnotes/p/6573776.html

相关文章:

  • 嵌入式软件设计第7次实验报告
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • httpclient 优化
  • PHPCMSV9上线方法及文件权限设置
  • 推理题:猜扑克牌
  • JS获取首字母
  • zabbix-----5-----自动发现的概念
  • NTP时钟同步学习记录
  • java基础知识 构造方法
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • IntelliJ IDEA 主题、字体、编辑区主题、文件编码修改
  • mediawiki登录时第一次会跳回登录页面,第二次才能登录成功
  • 更换好的yum源
  • 初识cesium----加载不同JSON格式例子
  • 《React Native高效开发》之create-react-native-app
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • gitlab-ci配置详解(一)
  • JavaScript DOM 10 - 滚动
  • JSONP原理
  • Linux中的硬链接与软链接
  • maven工程打包jar以及java jar命令的classpath使用
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python 反序列化安全问题(二)
  • scala基础语法(二)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 从输入URL到页面加载发生了什么
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 新版博客前端前瞻
  • 以太坊客户端Geth命令参数详解
  • 自制字幕遮挡器
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 昨天1024程序员节,我故意写了个死循环~
  • # 达梦数据库知识点
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (03)光刻——半导体电路的绘制
  • (C语言)二分查找 超详细
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一) springboot详细介绍
  • (一)Dubbo快速入门、介绍、使用
  • (转)可以带来幸福的一本书
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net开发时的诡异问题,button的onclick事件无效
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET业务框架的构建
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...