简单谈谈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 相关文章推荐
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
jquery attr方法获取input的checked属性问题
May 26 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
javascript+canvas制作九宫格小程序
Dec 28 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
Apr 26 Javascript
在jQuery中处理XML数据的大致方法
Aug 14 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
JS实现验证码倒计时的注册页面
Jan 02 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 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程序
2006/10/09 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
python编写爬虫小程序
2015/05/14 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
拾金不昧的表扬信
2014/01/16 职场文书
优秀部门获奖感言
2014/02/14 职场文书
美容院营销方案
2014/03/05 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
培训科主任岗位职责
2014/08/08 职场文书
普通员工辞职信范文
2015/05/12 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
领导欢送会主持词
2015/07/06 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL