感谢Philip Roberts的演讲Help, I'm stuck in an event-loop让我对javascript的运行机制有一定的理解。

javascript是一种单线程语言,所以任务(代码段)只能依次执行。当某一段代码执行IO任务时,CPU是空闲的,执行IO任务也不可能是当前线程,所以当前线程只有等执行IO任务的线程执行完毕,给当前线程发送消息,才能继续执行后面的代码,这样显然是没有必要的。我们完全可以继续执行其它需要CPU进行计算的任务,把需要其它设备执行并等待执行结果的任务暂时搁置,等其它线程对当前进程发送消息表示任务执行完毕之后,再考虑执行这些任务。

javascript的运行机制可以通过以下一张图来说明:

javascript的任务可以分为同步任务,异步任务两种。所有同步任务都在主线程上执行,形成一个执行栈(execution context stack);所有的异步任务最开始都以消息的形式存在于callback 的队列当中。代码的执行顺序如下:

1.js解释器将首先执行所有的同步任务,如果有其它线程触发异步任务的消息到来,将该消息保存在callback队列里面,将其搁置。

2.同步任务执行完之后,将callback里面的消息所绑定的任务放到执行栈里面执行。

3.callback queue不断的接受消息,当执行栈为空的时候把队首的消息绑定的任务放到执行栈执行。

以上机制可以说明一些问题:

1.因为callback里面的消息都是其它线程发送的,而这些消息都是操作系统发出的,所以用户很难自定义消息来绑定一个异步任务,也就是异步任务的数量有限,我们不能增加,我们能增加的只是该与消息绑定的回调函数。

2.很多时候用户没有太大必要定义匿名回调函数。

3.可以通过封装已有异步任务的方式自定义适合自己的方法。

转载于:https://www.cnblogs.com/Return-0/p/5320658.html

javascript Event loop相关推荐

  1. 试图解释清楚【JavaScript Event Loop】

    本篇文章较长,让网络飞一会再看~ 本文结构 - 带着问题看这篇文章 - JS Runtime的几个概念 - Event Loop事件循环 - UI Rendering Task - 可视化:event ...

  2. javascript --- event loop

    栗子1 求下面函数的输出 console.log('script start');setTimeout(() => {console.log('setTimeoout'); }, 0);Prom ...

  3. JavaScript event loop事件循环 macrotask与microtask

    macrotask  姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. mic ...

  4. JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

    事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑. 众所周知,JS是单线程的,即同一时间只能运行一个任务.一般情况下这不会引发问题,但是如果我们有一个 ...

  5. javascript事件轮询(event loop)详解

    英语原文摘自:http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/ The JavaScript Eve ...

  6. 【转载】浏览器事件循环机制(event loop)

    首先,本文转自https://juejin.im/post/5afbc62151882542af04112d 当我看完菲利普·罗伯茨的 javascript event loop的演讲的时候,就对于事 ...

  7. 简单理解浏览器的event loop 和 JavaScript的同步异步

    为什么JavaScript是单线程的? JavaScript的主要用途是和用户进行交互以及对DOM的操作,为了避免复杂的同步问题(如果多线程,A线程对某DOM添加内容,B线程对它又进行了删除操作,这往 ...

  8. JavaScript 运行机制详解:Event Loop

    转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单 ...

  9. 笔试题——JavaScript事件循环机制(event loop、macrotask、microtask)

    今天做了一道笔试题觉得很有意义分享给大家,题目如下: setTimeout(()=>{console.log('A'); },0); var obj={func:function () {set ...

最新文章

  1. 如何在1分钟内CSDN收益1000万,走上人生巅峰?!
  2. [Java工程师面试精选]Redis cluster集群模式的原理
  3. 鸟哥的Linux私房菜(基础篇)-第二章、 Linux 如何学习(二.4. 鸟哥的建议(重点在solution的学习))
  4. AppVerifier的功能和原理
  5. java基础入门答案谭晓芳,原理+实战讲解
  6. 删除iptables nat 规则
  7. sp_help用法_sp_updatestats概述和用法
  8. 问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势
  9. 智能优化算法:学生心理学优化算法 -附代码
  10. atitit.js 与c# java交互html5化的原理与总结.doc
  11. AD18等长线、蛇形线的设置
  12. endnotex9切换中文_EndNoteX9常用方法汇总
  13. 高等数学课后答案上册同济大学第七版第一章答案
  14. linux系统管理考试试题及答案,《Linux系统管理》期末综合试题答案1
  15. 替罪羊树[Scapegoat Tree]
  16. 二次采样设置的四种彩色模式RGB565,ARGB8888,ARGB4444,ALPHA_8
  17. Python爬取蓝奏云直链(获取真实文件地址)
  18. Codeforces Round #700 (Div. 2)全部题解
  19. 工控系统设计(八)组态功能开发
  20. 校园、同城二手交易信息小程序 毕业设计毕业论文 开题报告和效果图参考(基于微信小程序毕业设计题目选题课题)

热门文章

  1. Let’ s Encrypt 现支持通配符的 HTTPS 认证
  2. Objective-C 中 NULL、nil、Nil、NSNull 的定义及不同
  3. math.floor实现四舍五入
  4. 深入浅出ClassLoader(译)
  5. Javascript常用正则表达式汇总
  6. (转)android UI进阶之自定义组合控件
  7. boost库的lock_ops类的变化
  8. 没有人愿意把自己放在被动的位置,一切皆是有原因的
  9. 2009年IT就业“危”中寻“机”
  10. C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍