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之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
随机推荐
- 数据挖据之GeoHash核心原理解析
引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐. 饭饱之后机机 ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- python bottle学习(三)动态路由配置(通配符)
from bottle import (run, route, get, post, default_app, Bottle) @route('/', method='GET') @route('/i ...
- 自己搭建v,p,n过程
安装dockeryum install -y docker把docker设置为服务systemctl enable docker.service启动dockersystemctl start dock ...
- 10招步骤保护IIS服务器安全
问题 IIS(Internet Information Server)是黑客特别喜欢的目标.因此,对于管理IIS网页服务器的管理员来说,确保服务器安全是一件至关重要的事.IIS 4.0和IIS 5.0 ...
- golang 内置函数new()
new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针. 在golang的代码定义如下: func new(t Type) ...
- 【BZOJ4384】[POI2015]Trzy wieże 树状数组
[BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ...
- swiper插件简介及用法
swiper Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.Swiper开源.免费.稳定. ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- 2015-03-12——简析DOM2级样式
CSSStyleSheet对象 表示某种类型的样式表CSSStyleRule对象 样式表中的每条规则 获得文档中的所有样式表document.styleSheets CSSStyleSheet对象 ...