一、为什么JavaScript是单线程?

JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事。具体地,一个window对应一个JavaScript线程。

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

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

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

二、JavaScript并发模型与事件循环

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。那么JavaScript是如何实现异步调用的呢?

JavaScript里这种并发的一种理论上的模型如下:

(1)所有同步任务依次被执行,在内存栈区域产生相应的栈帧(活动记录)。

(2)一个JavaScript运行时包含一个待处理的消息队列,每个消息都与一个函数相关联。当栈为空时,就从队列中取出一个消息并进行处理。这个处理过程包含了调用与这个消息相关联的函数(以及因而创建了一个初始堆栈帧)。当栈再次为空的时候,也就意味着消息处理结束。

这种处理方式通常使用如下的方式来实现:

while(queue.waitForMessage()){queue.processNextMessage();
}

如果当前没有任何消息,queue.waitForMessage会同步等待消息到来。

因此这个过程被称为事件循环。

每一个消息执行完成后,其他消息才会被执行。在浏览器里,当一个事件出现且一个事件监听程序被绑定时,消息会被随时添加,如果没有事件监听器,则事件丢失。调用setTimeout函数会在一个时间段过去后在队列中添加一个消息,这个时间段作为函数的第二个参数被传入。如果队列中没有其他消息,那么这个消息会被马上处理,但是如果有其他消息,则setTimeout消息必须等待其他消息处理完。因此第二个参数仅仅表示最少的时间而非确切的时间。

以Ajax为例,事件循环模型如下:

JavaScript单线程运行机制与并发模型相关推荐

  1. JavaScript的运行机制,简单大白话讲解.

    今天本来想写一篇async,await的文,但是讲它就得讲Promise,但是讲Promise又得讲异步编程,讲异步编程又得讲JS的运行机制.冷静一下 还是先讲讲基础吧 (本文仅为个人见解,有错误请指 ...

  2. JavaScript的运行机制

    目录 参考链接: 阮一峰运行机制详解 一.JavaScript是单线程语言: 二.JavaScript的事件循环机制: 同步任务(synchronous): 异步任务(asynchronous): 事 ...

  3. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...

  4. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...

    前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...

  5. javascript运行机制

    阮一峰的网络日志 » 首页 » 档案 搜索 上一篇:乔布斯的管理课 下一篇:编译器的工作过程 分类: JavaScript JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 ...

  6. 傻傻分不清的javascript运行机制

    学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆.Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable ...

  7. JavaScript 运行机制详解:Event Loop

    转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单 ...

  8. JavaScript 运行机制详解

    一:为什么JavaScript是单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. 那么,为什么JavaScript不能有多个线程呢? 这样能提高效率! Java ...

  9. 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop

    PS: 我先旁观下大师们的讨论,得多看书了~ 别人说的:"看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲 ...

最新文章

  1. 重要更新 | 谷歌发布 TensorFlow 1.4,迁移Keras,支持分布式训练
  2. 【js】typeof与instanceof
  3. web前端研发工程师编程能力成长之路
  4. 理解和配置 Linux 下的 OOM Killer
  5. java中的HashSet内部是如何工作的
  6. Vue于React特性对比(三)
  7. 1003 我要通过!(20)(20 分)
  8. rsync 服务快速部署手册
  9. PHP使用ajax的post方式下载excel文件简单示例
  10. Python中的@property Decorator:其用例,优点和语法
  11. Python使用字典get()方法TypeError: get() takes no keyword arguments
  12. 用JS实现自动提取身份证的出生日期
  13. 阿里云服务器用Docker配置运行nginx并访问
  14. python提取全部个股数据_Python 股票历史数据的获取
  15. 纯前端html导出pdf(jsPDF.js)-分页-不分页
  16. nx零件库插件_ug标准件库下载
  17. 从王自如和老罗的论战中我貌似懂得了点神马...
  18. 苹果历代iPod产品大全相册
  19. 电机控制(1)直流电机的控制
  20. Windows系统搭建GitServer--Bonobo Git Server

热门文章

  1. 程序员离职后12天,被前领导命令回去讲清代码?小伙直接说收费
  2. request.META里包含了哪些数据?
  3. windows安装npm教程
  4. ffmpeg调用directshow camera 并sdl渲染
  5. 获取本机IP和MAC地址
  6. redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...
  7. 我的docker随笔32:sftp服务部署
  8. 阿里云ECS修复ubuntu 16.04漏洞过程
  9. 嵌入式Linux入门12:编程规范
  10. 完成一个分析H264码流的工具