参考:https://segmentfault.com/a/1190000012925872#articleHeader4

一、为什么有Event Loop

Javascript设计之初就是一门单线程语言,Event Loop就是为了解决主线程不阻塞的问题。

二、Event Loop流程

1、js中有同步任务、异步任务两种

2、同步任务在JS引擎线程执行,形成执行栈

3、异步任务在已有异步操作结果符合触发条件时,进入任务队列(由事件触发线程管理)等待执行

4、执行栈中的任务运行完成后(JS引擎空闲),从任务队列中读取任务,加入到执行栈,并执行

三、图解流程、数据结构、与浏览器各线程之间关系

四、定时器

1、定时器是独立线程控制:

定时触发是由定时器线程控制的,这是因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确,因此很有必要单独开一个线程用来计时。

2、定时器实现流程

定时器实现在预先设定的时间后,将事件推入任务队列,等待执行栈执行。由于定时事件在推入任务队列中时,JS引擎线程正在执行其他任务,这时要定时事件要等待JS引擎线程空闲才能执行,就可能出现定时事件不能准时执行

3、对于0毫秒的定时:

W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms,但不排除不同浏览器最小事件设置不同。

即便时间间隔为0也需要进入任务队列等待JS引擎线程空闲的过程,执行栈中的任务还是早于定时任务执行

浏览器工作原理(三):js运行机制及Event Loop的更多相关文章

  1. Js 运行机制和Event Loop

    一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

  2. JS运行机制之 Event Loop 的思考

    先举个栗子,如下: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); //一秒之后输出几乎没 ...

  3. JavaScript 运行机制以及Event Loop(事件循环)

    一.JavaScript单线程 众所周知JavaScript是一门单线程语言,也就是说,在同一时间内JS只能做一件事.为什么JavaScript不能有多个线程呢?这样不是能够提高效率吗? JavaSc ...

  4. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

  5. js运行机制(线程)

    浏览器线程 js运作在浏览器中,是单线程的,即js代码始终在一个线程上执行,这个线程称为js引擎线程. 浏览器是多线程的,除了js引擎线程,它还有:  UI渲染线程 浏览器事件触发线程 http请求线 ...

  6. js 运行机制

    <script> console.log(1) setTimeout(function(){ console.log(3) },0) console.log(2) </script& ...

  7. Js 运行机制 (重点!!)

    一.引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: 这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了.题目的答案是依次输出1 2 3 ...

  8. js 运行机制简单了解

    一.如何理解 JS 的单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScrip ...

  9. js运行机制详解:event loop

    总结 阮一峰老师的博客 一.为什么JavaScript是单线程 JavaScript语言的一大特点就是单线程 那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript ...

随机推荐

  1. Linux:更改hostname主机名

    更改hostname主机名 查看主机名 hostname 临时更改主机名 hostname youname 更改永久生效主机名 1)更改配置文件 vi /etc/sysconfig/network 2 ...

  2. 使用fill_n算法

    今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...

  3. HAWQ + MADlib 玩转数据挖掘之(一)——安装

    一.MADlib简介 MADlib是Pivotal公司与伯克利大学合作的一个开源机器学习库,提供了精确的数据并行实现.统计和机器学习方法对结构化和非结构化数据进行分析,主要目的是扩展数据库的分析能力, ...

  4. RxJava 1.x 笔记:过滤型操作符

    我真的是奇怪,上下班的路上看书.看文章学习的劲头特别大,到了周末有大把的学习时间,反而不珍惜,总想打游戏,睡前才踏踏实实地写了篇文章,真是服了自己! 本文内容为 RxJava 官方文档 学习笔记 作者 ...

  5. java入门学习(5)—面向对象注意点总结

    1.一个类里面最多有5种成份(属性,方法,构造器,还有两种还没有涉及). 2.定义方法时又返回值的保证最起码有一个有效的return语句,最起码让其在编译的时候就识别到,而不是经过判断识别,如通过if ...

  6. [Python] RuntimeError: Invalid DISPLAY variable

    1.问题:在本地用matplotlib绘图可以,但是在ssh远程绘图的时候会报错 RuntimeError: Invalid DISPLAY variable 2.原因:matplotlib的默认ba ...

  7. [Linux] mysql的安装和使用

    1.安装 sudo apt-get install mysql-server sudo apt-get install mysql-client 安装的时候会提示设置密码 2.使用 (1)mysql操 ...

  8. 高并发异步uwsgi+web.py+gevent

    为什么用web.py? python的web框架有很多,比如webpy.flask.bottle等,但是为什么我们选了webpy呢?想了好久,未果,硬要给解释,我想可能原因有两个:第一个是兄弟项目组用 ...

  9. xz文件的解压缩

    前情 偶然发现了一个新的压缩文件类型 .xz 解决 其实很简单 xz -d ***.xz之后文件将会变为tar后缀 tar xvf ***.tar即可 另外 tar解压缩的时候,j代表bzip2,z代 ...

  10. 动态Json字符串的解析

    动态Json字符串的解析 对于传统的Json字符串,比如有规定属性的对象,通常都会采用反序列化的方式就可以了,例如下面的方式: DataContractJsonSerializer ser = new ...