JavaScript的消息机制

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

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

时间: 2024-10-10 00:05:08

JavaScript的消息机制的相关文章

JavaScript消息机制入门篇

JavaScript这个语言本身就是建立在一种消息机制上的,所以它很容易处理异步回调和各种事件.这个概念与普通的编程语言基础是不同的,所以让很多刚接触JavaScript的人摸不着头脑.JavaScript就是通过消息来实现多个事务同时处理,不要把自己吊死在一个消息中. 经常会看到这样的问题“JavaScript有sleep函数吗?”.“如何让上面的函数执行完后再执行下面的函数?”,就是因为没有理解消息机制才会发出这样的疑问.JavaScript是单线程的,要是有sleep函数,那在sleep的

JavaScript的运行机制

1.JavaScript的单线程机制 2.任务队列(同步任务和异步任务) 3.事件和回调函数 4.定时器 5.Event Loop事件循环 一.JavaScript的单线程机制,JavaScript的使用单线程是由其主要用途有关,JavaScript是在用户互动.操作DOM元素,如果使用多线程则会带来很多问题,同时操作一个DOM进行删除和添加操作,浏览器无法选择执行那个线程? 二.任务队列,单线程机制,JavaScript的任务就是依次执行,但是CPU与IO设备(ajax网络读取数据,鼠标,键盘

Javascript引擎单线程机制及setTimeout执行原理说明

setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何改变而忽略这两句话,因此我们可以通过setTimeout把“设回白色”函数加入下一个堆栈,那么就可以确保背景颜色发生过改变了(虽然速度很快可能无法被察觉). 总之,setTimeout增加了Javascript函数调用的灵活性,为函数执行顺序的调度提供极大便利. 然后,我们从基础的层面来看看:理解J

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)

摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5.0为对象,用这两种语言各编制一应用程序,并能很好的通过消息进行交互. 关键字:vc++.delphi.消息 一. 引言 编制较大型的程序往往需要将一个项目分割成若干个模块,由若干个开发小组共同完成.笔者曾参加过几个大型项目的研发工作,根据需要往往要将项目分为解为几大部分,分到三.四家科研单位共同完成

Broadcom的消息机制

在Broadcom中提供了自己的消息机制,有两种消息形式:Request/Response and Event(事件) Request/Response消息:进程之间的通信都是通过smd,所有的消息都是先发送到smd,smd收到信息后,如果消息目的是smd的就做相应的操作,如果不是,就把这个消息route出去 Event messages :对某些事件感兴趣的进程,可以CMS_MSG_REGISTER_EVENT_INTEREST注册此感兴趣事件.事件发生时,将事件信息发送给smd,smd再将事

Android的消息机制之ThreadLocal的工作原理

提到消息机制大家应该都不陌生,在日常开发中不可避免地要涉及到这方面的内容.从开发的角度来说,Handler是Android消息机制的上层接口,这使得开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行.很多人认为Handler的作用是更新UI,这说的的确没错,但是更新UI仅仅是Handler的一个特殊的使用场景,具体来说是这样的:有时候需要在子线程中进行耗时的IO操作,这可能是读取文件或者访问网络等,当耗时操作

android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)

继续分析handler 和looper 先看看handler的 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } 所以消息的处理分层三种,就是 1.传入一

深入Windows内核——C++中的消息机制

<编程思想之消息机制>一文中我们讲了消息的相关概念和消息机制的模拟,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果如下: 图 2 :效果图 Win32Test.h #pragma once #include <windows.h> #include <atltypes.h> #include <tchar.h> //资源ID #define ID_BUTTO