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. XML简单学习

    XML简单概述 1.Extensible Markup language可扩展标记语言; 2.作用:具有层次性的描述有关系的数据: 体现在:描述数据关系:软件配置,以描述程序模块之间的关系: 语法介绍 ...

  2. 开发人员需知的Web缓存知识(转)

    什么是Web缓存,为什么要使用它? 缓存的类型: 浏览器缓存: 代理服务器缓存: 网关缓存: Web缓存无害吗?为什么要鼓励缓存? Web缓存如何工作 如何控制缓存和不缓存: HTML Meta标签 ...

  3. CGContextRef用法

    本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...

  4. Java中匿名内部类

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  5. Adapter适配器 final int Id 导致选中的Item不在当前界面

    写了上面这么一个横向混动,点击切换到,哪个的Item上就会有一个  常用  的小图标.但是我每次滑动切换到后面   成龙9这个Item,这个 常用的图片,也在 这个上面了,但是他一更新,就变成 等你再 ...

  6. Fragment切换页面

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  7. poj万人题

    poj提交数量过万的题,除了水爆了的题就是无比经典的,不得不刷的题. 准备将poj上提交次数过万的题刷个遍. 持续更新中... poj 2828(线段树) 此题乃是Zhu, Zeyuan神牛出的,拿到 ...

  8. 一个有意思的 Java HashSet 问题

    昨天,在百度的 java吧 看到有人问关于 HashSet 的问题.下面是他贴出的代码: import java.util.HashSet; public class JavaTest { publi ...

  9. [Algorithms] Counting Sort

    Counting sort is a linear time sorting algorithm. It is used when all the numbers fall in a fixed ra ...

  10. node.js开发学习一HelloWorld

    前言:由于公司业务需求,最近启动了node.js的开发任务,想把自己的开发学习历程记录记录下来,可以增加记忆,也方便查找.虽然对javascript有一定的了解,但是刚接触node.js的时候,发现还 ...