消息队列的添加【Javascript事件轮询】如果你申明了一个异步函数(例如setTimeout) , 其回调函数最终会在一个不同的消息队列中执行 , 在未来的事件轮询中的某个时刻 。例如:
function f() { console.log("foo"); setTimeout(g, 0); console.log("baz"); h();}function g() { console.log("bar");}function h() { console.log("blix");}f();由于setTimeout非阻塞的本质 , 它的回调函数的未来的若干毫秒后执行并且等待期间不占用该消息的进程 。在这个例子中 , setTimeout跳过它的回调函数g和一段事件的延迟后被唤起 。当预先声明的时间结束(在这个例子中几乎是立即执行)被分离出去的消息又被重新加回队列 , 包括其回调函数g 。这个回调函数被激活就好比:”foo”,”baz”,”blix”然后执行下一个事件轮询的tick:”bar” 。如果在一个框架中同时声明了两个setTimeout , 并且他们的第二个参数(执行时间)想同 , 他们的回调将会按照其定义顺序执行 。
Web Workers利用Web Workers能让你丢掉昂贵的多线程执行方式 , 释放主线程去做其他的事 。Web Workers包括单独的消息队列 , 事件轮询 , 以及实例化了一个独立于最初的主线程的储存空间 。利用消息传递来建立消息与主线程之间的联系 , 这种联系非常像我们刚才的代码示例 。
文章插图
首先 , 我们的worker:
// our worker, which does some CPU-intensive operationvar reportResult = function(e) { pi = SomeLib.computePiToSpecifiedDecimals(e.data); postMessage(pi);};onmessage = reportResult;然后 , 这是在html中的代码内容:
// our main code, in a <script>-tag in our HTML pagevar piWorker = new Worker("pi_calculator.js");var logResult = function(e) { console.log("PI: " + e.data);};piWorker.addEventListener("message", logResult, false);piWorker.postMessage(100000);该示例中 , 主线程产生一个worker然后将一个logResult回调函数注册到消息队列中 。在worker中 , reportResult函数被注册到它自己的消息事件中 。当worker线程从主线程接收消息时 , worker将消息及其相应的回调函数加入队列中 。当消息队列按顺序执行到该消息时 , 主线程将发回一条消息并将一条新的消息加入队列(按照logResult的回调排序)由此开发者能让CPU集中处理分线程 , 释放主线程继续处理消息任务及其绑定事件 。
关于闭包Javascript支持闭包 , 准许注册回调 , 当我们执行回调时 , 通过执行回调创造的新的完全调用栈来维持我们创造的环境的入口 。回调函数作为不同于我们创造的消息的一部分被调用 。考虑如下示例:
function changeHeaderDeferred() { var header = document.getElementById("header");setTimeout(function changeHeader() { header.style.color = "red"; return false; }, 100); return false;}changeHeaderDeferred();在这个示例中 , 以头变量方式声明的changeHeaderDeferred函数被执行 。setTimeout函数被唤醒 , 导致消息(加在changeHeader回调中的)大约在100毫秒之后(时间偏差源于每台计算机内置原子钟差异)添加到消息队列 , changeHeaderDeferred返回false , 结束第一条消息的进程 , 然而头变量依然通过闭包的方式存在 , 没有被垃圾回收机制回收 。当第二条消息执行(changeHeader函数)维持头变量声明的外部函数域的入口 。一旦第二条消息(changeHeader函数)执行完毕 , 头变量则被回收 。
另外Javascript的事件驱动交互模型不同于大多数编程人员习惯的请求-响应模型 , 但是你能看到 , 该技术也不是那么高不可攀 。一个简单的消息队列及事件轮询 , Javascript使得开发者能够围绕收集异步回调的形式来建立他们的系统 , 在等待外部事件发生的同时释放主线程去做其它操作 。它将越来越流行 。
希望本文能帮助到您!点赞+转发 , 让更多的人也能看到这篇内容(收藏不点赞 , 都是耍流氓-_-)
关注 {我} , 享受文章首发体验!
每周重点攻克一个前端技术难点 。更多精彩前端内容私信 我 回复“教程”
原文链接:http://eux.baidu.com/blog/fe/javascript-loop
作者:erin
推荐阅读
- 1分钟读懂JavaScript、Ajax、jQuery全部知识点
- 百慕大三角的真相 百慕大三角真实事件
- 加拿大为什么针对孟晚舟 加拿大对孟晚舟事件的态度
- 恐怖食人案视频 历史上人吃人的事件
- JS-垃圾机制
- 昨天撞船新闻 撞船事件
- 重学之JavaScript HTML Element 常用API解析
- “反向代理层”绝不能替代“DNS轮询”
- 前端:html+css+javascript 手把手教大家编写贪吃蛇小游戏
- 如何简单理解 JavaScript 的 Async 和 Await?