简单谈谈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 each()方法的使用方法
Mar 18 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
javascript创建和存储cookie示例
Jan 07 Javascript
Bootstrap实现默认导航栏效果
Sep 21 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
Jul 19 Javascript
js模拟F11页面全屏显示
Sep 17 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
js cavans实现静态滚动弹幕
May 21 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
Jul 27 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和ACCESS写聊天室(三)
2006/10/09 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
js实现转动骰子模型
2019/10/24 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
什么是规则表达式
2012/05/03 面试题
挂牌仪式主持词
2014/03/20 职场文书
小露珠教学反思
2014/04/30 职场文书
给校长的建议书范文
2015/09/14 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
java解析XML详解
2021/07/09 Java/Android
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis