JavaScript本身是单线程的,但它却是事件驱动的。类似Windows窗体应用程序,它也需要消息队列机制来实现。程序的执行并不是连续的,绝大多数时间都在等待消息。每次执行执行程序都是在响应消息,这样就可以把消息当作一种类似作用域的东西来处理。
  消息是什么?说白了就是事件,只是有很多系统事件是不需要我们自己来处理的。比如Paint事件,也许你听都没听过,这就是因为它没有在JavaScript中的接口。还有初始化事件,当一个JavaScript载入完成时,里面的代码就需要执行,这就是初始化事件触发的。也就是说,代码载入完成后会接收到一个初始化消息,这个消息的工作就是执行代码。初始化事件就涉及到了JavaScript,但是它的工作只是执行代码,我们无法指定它做别的事情。剩下的还有用户事件,比如鼠标事件、键盘事件、计时器事件,等这些是可以为它们指定动作的。
  现在回头来看单线程的JavaScript。其实说JavaScript单线程还不够确切,整个网页的工作都是单线程的,JavaScript只是其中之一。如果你在页面上放一个死循环,就会导致整个页面不响应,包括HTML和CSS都会不响应。当然有些组件是有自己的线程,所以不会被死循环影响,咱就不说它们了。那么,页面为什么不响应呢?这就是因为线程被死循环占用了。这时候,即使有消息传入(事件触发)也没有线程可以来运行事件的程序了。这些需要等待处理的消息就会被放入消息队列中,这个模式和Windows窗体应用程序是一样的。所以我们也对JavaScript引入消息机制这个概念。
  我之前一直都没意识到这个东西的重要性,所以没写这篇。但是很多东西都使用了消息机制的概念,如果不写这篇文章就无法在其它文章中描述清楚。之前的文章也有涉及到了消息机制的,比如“indexedDB的事务机制”,将要写的关于WebGL的文章也会用到这个。现在,咱先来看一段代码吧
;
setTimeout(;i<1E9;i++);
console.log(a); //无论上面循环多少次都是输出0
  这个代码加载完成后,程序会收到它的初始化消息,也就是会运行这个代码。或者说,这个代码的运行就是在处理初始化消息。第二行的setTimeout会给当前程序发送一个计时器消息。但是当前线程正在处理初始化消息,哪有空理会这个新的消息呀?于是这个消息就暂时被放入消息队列中,等待初始化消息处理完成。第三行的for,无论循环多少次,它都是在初始化消息中的。就算这个循环是需要很长事件才能完成的,初始化消息也不会释放线程的控制权给其它消息。只要等初始化消息被全部处理完之后线程的控制权才会被释放,然后才会处理消息队列中的其它消息。
  也许没多少内容,不过这个概念很重要的。

原文链接:http://www.web-tinker.com/article/20164.html

JavaScript的消息机制的更多相关文章

  1. JavaScript消息机制入门篇

    JavaScript这个语言本身就是建立在一种消息机制上的,所以它很容易处理异步回调和各种事件.这个概念与普通的编程语言基础是不同的,所以让很多刚接触JavaScript的人摸不着头脑.JavaScr ...

  2. 简述JavaScript的运行机制

    想要理解JavaScript的运行机制,需要分别深刻理解以下几个点: · JavaScript的单线程机制 · 任务队列(同步任务和异步任务) · 事件和回调函数 · 定时器 · Event Loop ...

  3. 浅谈javascript的运行机制

    积累一下这几天学的,记录一下: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程 ...

  4. Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?

    我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...

  5. javaScript的执行机制-同步任务-异步任务-微任务-宏任务

    一.概念理解 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascr ...

  6. 图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室

    图形验证插件 网上找了很多图形验证插件,比较推荐verify.js <link rel="stylesheet" type="text/css" href ...

  7. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  8. javascript的垃圾收集机制

    × 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...

  9. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

随机推荐

  1. Windows应用程序运行权限设置

    在Vista以后的windows版本中,有些时候需要提升编译后生成程序的权限,即希望让生成的程序以管理员身份运行.虽然在一般情况下,可以使用鼠标右键选择的方式来强行以管理员身份运行,但它并没有屏蔽普通 ...

  2. AWS系列-根设备类型

    1.AWS根设备类型分为两类 实例存储(本地存储) EBS存储(网络存储) 2.实例存储 系统和磁盘在同一主机上 3.EBS存储 Elastic Block Storage EBS可能与云主机不在一台 ...

  3. cocos3.x 实现android沉浸式模式(全屏,隐藏导航栏即虚拟键)

    只有在Android 4.4及以上系统才支持沉浸式模式,修改 AppActivity代码如下: @Override public Cocos2dxGLSurfaceView onCreateView( ...

  4. 3969 [Mz]平方和【斐波那契平方和】

    3969 [Mz]平方和  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 斐波那契数列:f[0 ...

  5. 带jsk证书,请求https接口

    首先是三个返回的实体类 BaseVo.java package https2; import java.io.Serializable; import java.lang.reflect.Invoca ...

  6. python之MySQL学习——简单的增删改查封装

    1.增删改查封装类MysqlHelper.py import pymysql as ps class MysqlHelper: def __init__(self, host, user, passw ...

  7. 手动爬虫之糗事百科(ptyhon3)

    一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...

  8. Powershell实现Telnet Port

    Telnet Port 脚本 $servers = get-content D:\ps\ServerIPAddress.TXT $portToCheck = '80' for($i=1;$i -le ...

  9. Java 集合框架查阅技巧

    如何记录每一个容器的结构和所属体系呢? List ArrayList LinkedList Set HashSet TreeSet 其中,后缀名就是该集合所属的体系,前缀名就是该集合的数据结构. 看到 ...

  10. mysql 客户端命令行下 直接查询并导出数据

    mysql原来还能这么导出数据,涨知识了. 方式1: select ....(sql语句) INTO OUTFILE   '/var/lib/mysql/msg_data.csv ' (导出的文件位置 ...