简单谈谈JavaScript的同步与异步


Posted in Javascript onDecember 31, 2015

1.手绘一张图说明。

简单谈谈JavaScript的同步与异步

2.为什么JavaScript是单线程(这里引用阮一峰老师的话)

JavaScript的单线程,与它的用途有关。

作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。

这决定了它只能是单线程,否则会带来很复杂的同步问题。

比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。

所以,这个新标准并没有改变JavaScript单线程的本质。

传送门:JavaScript运行机制之事件循环(Event Loop)详解

3.JavaScript的异步体现在哪

如一开始的图,个人认为左边主线程就是同步,左边事件队列(消息队列)就是异步。

当然JavaScript中的异步有很多:

Ajax(XMLHttpRequest)
Image Tag,Script Tag,iframe(原理类似)
setTimeout/setInterval
CSS3 Transition/Animation
postMessage
Web Workers
Web Sockets
and more…
Javascript 相关文章推荐
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
jquery.map()方法的使用详解
Jul 09 Javascript
JS文字球状放大效果代码分享
Aug 19 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
Javascript快速实现浏览器系统通知
Aug 26 Javascript
node.js通过axios实现网络请求的方法
Mar 05 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 Javascript
Javascript Dom元素获取和添加详解
Sep 24 Javascript
详解Javascript实践中的命令模式
May 05 Javascript
jQuery实现简单的图片查看器
Sep 11 #Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 #Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 #Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
Dec 30 #Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 #Javascript
JavaScript阻止回车提交表单的方法
Dec 30 #Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 #Javascript
You might like
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
js实现图片轮播效果
2015/12/19 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
物业管理员岗位职责范文
2013/11/25 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
工业设计专业自荐书
2014/06/05 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
世界气象日活动总结
2015/02/27 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫