JavaScript的消息机制
JavaScript本身是单线程的,但它却是事件驱动的。类似Windows窗体应用程序,它也需要消息队列机制来实现。程序的执行并不是连续的,绝大多数时间都在等待消息。每次执行执行程序都是在响应消息,这样就可以把消息当作一种类似作用域的东西来处理。
消息是什么?说白了就是事件,只是有很多系统事件是不需要我们自己来处理的。比如Paint事件,也许你听都没听过,这就是因为它没有在JavaScript中的接口。还有初始化事件,当一个JavaScript载入完成时,里面的代码就需要执行,这就是初始化事件触发的。也就是说,代码载入完成后会接收到一个初始化消息,这个消息的工作就是执行代码。初始化事件就涉及到了JavaScript,但是它的工作只是执行代码,我们无法指定它做别的事情。剩下的还有用户事件,比如鼠标事件、键盘事件、计时器事件,等这些是可以为它们指定动作的。
现在回头来看单线程的JavaScript。其实说JavaScript单线程还不够确切,整个网页的工作都是单线程的,JavaScript只是其中之一。如果你在页面上放一个死循环,就会导致整个页面不响应,包括HTML和CSS都会不响应。当然有些组件是有自己的线程,所以不会被死循环影响,咱就不说它们了。那么,页面为什么不响应呢?这就是因为线程被死循环占用了。这时候,即使有消息传入(事件触发)也没有线程可以来运行事件的程序了。这些需要等待处理的消息就会被放入消息队列中,这个模式和Windows窗体应用程序是一样的。所以我们也对JavaScript引入消息机制这个概念。
我之前一直都没意识到这个东西的重要性,所以没写这篇。但是很多东西都使用了消息机制的概念,如果不写这篇文章就无法在其它文章中描述清楚。之前的文章也有涉及到了消息机制的,比如“indexedDB的事务机制”,将要写的关于WebGL的文章也会用到这个。现在,咱先来看一段代码吧; 这个代码加载完成后,程序会收到它的初始化消息,也就是会运行这个代码。或者说,这个代码的运行就是在处理初始化消息。第二行的setTimeout会给当前程序发送一个计时器消息。但是当前线程正在处理初始化消息,哪有空理会这个新的消息呀?于是这个消息就暂时被放入消息队列中,等待初始化消息处理完成。第三行的for,无论循环多少次,它都是在初始化消息中的。就算这个循环是需要很长事件才能完成的,初始化消息也不会释放线程的控制权给其它消息。只要等初始化消息被全部处理完之后线程的控制权才会被释放,然后才会处理消息队列中的其它消息。
setTimeout(;i<1E9;i++);
console.log(a); //无论上面循环多少次都是输出0
也许没多少内容,不过这个概念很重要的。
原文链接:http://www.web-tinker.com/article/20164.html
JavaScript的消息机制的更多相关文章
- JavaScript消息机制入门篇
JavaScript这个语言本身就是建立在一种消息机制上的,所以它很容易处理异步回调和各种事件.这个概念与普通的编程语言基础是不同的,所以让很多刚接触JavaScript的人摸不着头脑.JavaScr ...
- 简述JavaScript的运行机制
想要理解JavaScript的运行机制,需要分别深刻理解以下几个点: · JavaScript的单线程机制 · 任务队列(同步任务和异步任务) · 事件和回调函数 · 定时器 · Event Loop ...
- 浅谈javascript的运行机制
积累一下这几天学的,记录一下: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程 ...
- Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?
我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...
- javaScript的执行机制-同步任务-异步任务-微任务-宏任务
一.概念理解 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascr ...
- 图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室
图形验证插件 网上找了很多图形验证插件,比较推荐verify.js <link rel="stylesheet" type="text/css" href ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- javascript的垃圾收集机制
× 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
随机推荐
- 小白用advanced installer建安装包
写这篇文章的目的是由于肯定有人跟我一样非常小白,对安装包的构建又好奇.而我自己呢也要mark一下下,so--- 一.VS安装项目 首先关于安装包的构建,实用VS自带建安装项目的方式.网上有个中文工具叫 ...
- (转)java synchronised关键字
转自:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html Java 多线程(六) synchronized关键字详解 Java ...
- 在ChemDraw中输入千分号的方法
很多的用户都会使用ChemDraw化学绘图工具来绘制一些化学反应的过程,但是一些化合物中有些元素所占的比例是非常小的,这个时候往往就需要千分号来显示比例.但是在ChemDraw的工具栏上只有百分号没有 ...
- Android无线测试之—UiAutomator UiCollection API介绍
UiCollection类介绍 一.UiCollection类说明 1)UiCollection类是UiObject类的子类,即UiObject类的所有方法都被UiCollection继承下来了,都可 ...
- ios 时间解析 差8个小时
啥问题也有:小程序中web开发工具里显示时间正常,ios上显示的查8小时 原因: 使用 NSDate *date = [NSDate date]; 获取的时间是标注的UTC时间,和北京时间相差8小时. ...
- json字符串和json对象的转换
http://www.json.org/提供了一个json2.js,这样ie8(兼容模式),ie7和ie6就可以支持JSON对象以及其stringify()和parse()方法: parse用于从一个 ...
- Java利用dom4j生成xml文件、解析XML
package com.fq.fanqi; import java.io.File;import java.io.FileWriter;import java.io.IOException;impor ...
- Oracle数据库的连接模式connection Mode、连接connection与会话session
数据库的连接模式Connection Mode: Dedicated Server Mode(专有模式) 当用户发出请求时,如远程的client端通过监听器连接数据库上,ORACLE的服务器端会启用一 ...
- 三报文握手而不是三次握手 wireshark 封包详细信息 (Packet Details Pane) wireshark与对应的OSI七层模型 TCP包的具体内容 分析TCP三次握手过程
总结: 1.tcp报文非数据部分4*6字节 2.RFC 973 <计算机网络> 谢希仁 three way (three message) handshake 只是一次握手 同步位SYN. ...
- 6.Insert Documents-官方文档摘录
总结 1.插入单文档 db.inventory.insertOne( { item: "canvas", qty: , tags: , w: 35.5, uom: "cm ...