JavaScript的运行机制
目录
参考链接:
阮一峰运行机制详解
一、JavaScript是单线程语言:
二、JavaScript的事件循环机制:
同步任务(synchronous):
异步任务(asynchronous):
事件循环过程:
三、宏任务和微任务:
示例:
参考链接:
大佬博文参考链接
一、JavaScript是单线程语言:
JavaScript语言最大的特点就是单线程,即同一时间只能做一件事情,做完一件事情之后才能去做另一件事情。
例如,大家在银行排队取钱,一个窗口工作人员一次只能为一个客户服务,不能同一时间为多个顾客服务,负责就乱套了。JavaScript的单线程与它的用途有密切的关系。作为浏览器脚本语言,JavaScript的主要用途是与用户之间进行交互,以及操作DOM。这决定了它只能是单线程,否则就会带来复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM上添加节点,另一个线程删除节点,这时候浏览器以哪个线程为准来进行工作呢?
所以,为了避免同步的复杂性,从一诞生JavaScript就是单线程,这已经成为了这门语言的核心特征。为了利用多核CPU的计算能力,HTML5提出了Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程的控制,并且不可以操作DOM。所以一切JavaScript版的“多线程”都是通过单线程模拟出来的,这个新标准并没有改变JavaScript单线程的本质。
二、JavaScript的事件循环机制:
单线程就意味着所有任务需要排队,前一个任务结束才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等待。我们在浏览页面网站的时候,有一些图片是要通过数据请求之后才能加载显示的,那么我们整个页面是不是要等某一个比较大的图片加载完成之后整个网站才能显示出来呢?这样做显然是不行的,所以JavaScript语言的设计者意识到了这一点,于是将所有的任务分成了两种:
同步任务(synchronous):
同步任务指的是:在主线程上排队执行的任务,只有前一个任务执行完毕才能执行后一个任务。所有的同步任务都在主线程上执行,形成了一个执行栈。执行栈的执行顺序是后进先出。
异步任务(asynchronous):
异步任务指的是:不进入主线程,而是进入“任务队列”的任务。只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
事件循环过程:
- 同步任务和异步任务分别进行不同的场所,同步任务进入主线程,异步任务进入事件表(Event Table)并且注册函数。
- 当指定的事情完成之后(例如接受到了Promise对象的返回结果resolve/reject),事件表(Event Table)会将这个函数移入到任务队列(Event Queue)。
- 主线程内的任务执行完毕之后,回去任务队列(Event Queue)读取对应的函数,移入到主线程执行。
- 上述过程不断重复,这就是事件循环(Event Loop)
三、宏任务和微任务:
如果有同学对于定时器不是很了解的话,可以先了解一下:定时器参考。如果对于Promise相关内容不是很了解的话,可以先了解一下:Promise(菜鸟教程)和 Promise(ECMA6入门)。
宏任务(macro-task)包含:整体代码script、setTimeout函数、setInterval函数。微任务(micro-task)包含:Promise、process.nextTick。
事件循环的顺序决定了JavaScript代码的执行顺序。首先进入整体代码script对应的脚本文件之后,开始第一次的循环。接着执行所有的微任务,然后再次从宏任务开始执行,找到对应的任务队列执行完毕,再次执行所有的微任务,以此循环。
在执行宏任务或者微任务的过程中,里面的微任务的优先级是大于宏任务的,也就是先执行微任务再执行宏任务。
示例:
分析一下代码段的执行过程,并写出输出结果:
setTimeout(()=>{console.log("定时器");
});new Promise(function(resolve, reject) {console.log("Promise");resolve();
}).then(function() {console.log("Promise回调");
});console.log("结束");
- 首先进入整个js文件,是一个宏任务。
- 遇到setTimeout宏任务,这是一个异步任务,进入事件表(Event Table)并注册函数,等定时结束之后将函数移入到任务队列(Event Queue)
- 遇到 new Promise执行同步代码console.log("Promise"),输出Promise。接收到resolve的返回结果,遇到then回调微任务,进入事件表(Event Table)并注册函数,然后将这个函数移入到任务队列(Event Queue)
- 遇到console.log("结束")。输出结束
- 一轮宏任务处理完毕,判断是否有微任务需要处理。有then回调微任务,输出Promise回调
- 一轮事件循环结束,先找到setTimeout宏任务执行,输出定时器,再继续寻找是否有微任务?没有,开始下一轮事件循环。是否有宏任务可以进行循环?没有,事件循环结束。
JavaScript的运行机制相关推荐
- JavaScript的运行机制,简单大白话讲解.
今天本来想写一篇async,await的文,但是讲它就得讲Promise,但是讲Promise又得讲异步编程,讲异步编程又得讲JS的运行机制.冷静一下 还是先讲讲基础吧 (本文仅为个人见解,有错误请指 ...
- JavaScript单线程运行机制与并发模型
一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事.具体地,一个window对应一个JavaScript线程. JavaScript ...
- 傻傻分不清的javascript运行机制
学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆.Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable ...
- JavaScript 运行机制详解:Event Loop
转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单 ...
- JavaScript 运行机制详解
一:为什么JavaScript是单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. 那么,为什么JavaScript不能有多个线程呢? 这样能提高效率! Java ...
- 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop
PS: 我先旁观下大师们的讨论,得多看书了~ 别人说的:"看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲 ...
- JavaScript 运行机制详解(理解同步、异步和事件循环)
1.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...
- JavaScript 运行机制详解:再谈Event Loop
原文地址:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Eve ...
- javascript运行机制
阮一峰的网络日志 » 首页 » 档案 搜索 上一篇:乔布斯的管理课 下一篇:编译器的工作过程 分类: JavaScript JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 ...
最新文章
- python3数据库框架_python3之pymysql
- MongoDB使用小结:一些常用操作分享
- 类似人手的手部假肢相关研究登上Science子刊封面
- 不是多家族媒体集的一部分,可用bakup with format来构造新的媒体集.
- wireshark抓包详解
- centos dovecot mysql_Centos6.4 配置postfix+dovecot+mysql
- Elasticsearch Java API 的使用—多条件查询
- mac上的更新node npm
- java jml_JML 入门
- 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
- magento开启模板路径提示
- 安全编码最佳实践:PHP及编程语言安全
- java请求超时异常捕获_我异常了,快来捕获我,Java异常简述
- ScrollMagic-jQuery元素滚动动画库插件
- 十款好用的PDF编辑软件推荐
- Win7系统能用一键装机的方式安装win10吗?
- [附源码]计算机毕业设计JAVAjsp宾馆客房管理系统
- 股权比例的3种黄金分割线
- ajax返回map的值,同时在sucess返回时的显示
- linux怎么将一个文件移动到另一个目录下
热门文章
- 视频文件损坏如何修复
- Android历史版本详解
- CiteSpace与Histcite在文献引用上的区别
- android手势密码csdn,Android手势密码LockPatternView、LockPasswordUtils、LockPatternUtils等分析...
- 如何防止外人拷贝服务器上的文件,怎样防止别人用U盘拷贝我的文件 禁止u盘拷贝文件设置方法图文详细教程...
- 基于单片机智能温室大棚控制系统
- 【蓝桥杯单片机组硬件原理】
- 群晖NAS 7.X 搭建个人博客网站并发布公网 8/8
- java开发计划怎么写_【精编范文】从事java,下一工作阶段的工作计划以及业绩目标,怎么写-精选word文档 (16页)...
- Bios 下的UCSI