macrotask  姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. microtask 微任务,也称job.例如: process.nextTick, Promise(原生), Object.observe, MutationObserver 备注:同时需要注意的是,在 ES 当中称 microtask 为 “jobs”.比如 ES6标准 8.4节当中的 “Enqueue…
javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.log('0') setTimeout(function () { console.log('1'); }); new Promise(function(resolve,reject){ console.log('2') resolve(3) }).then(function(val){ console…
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制. Event Loop (事件循环): 只要主线程空了,就去读取“任务队列”,从任务队列中读取事件,这个过程是循环不断的,所以整个的这个运行机制叫  Event Loop. 主线程运行的时候,产生堆(head)和栈(stack),栈中的…
JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件之间又是怎么样的一个顺序呢,比如多个setTimeout事件又是怎么样一个执行顺序?这就涉及到事件循环:Event Loop. JS的单线程 虽然现在的JS可以用来做多方面的开发,但是最初的JS是浏览器的专用语言,用来操作DOM.所以从诞生之初,JS就被设计成单线程语言,原因是不想让浏览器变得太复杂…
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进入主线程,而是进入一个 "任务队列" 里,"任务队列" 通知主线程,该异步任务才会进入主线程执行. 任务的运行机制如下: 1.所有同步任务在主线程上执行,形成一个 "执行栈",注意栈是先进后出的. 2.主线程外,有一个 "任务队列"…
从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列(根据MDN准确的说应该是消息队列 message queue)之中放置一个消息(一般都是异步的回调函数). 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取消息队列,将可运行的异步任务添加到可执行栈中,开始执行. 看图:…
线程,是程序执行流的最小单位.线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行.线程有就绪,阻塞,运行三种基本状态. 阮一峰大神针对进程和线程的类比,很是形象:计算机的核心CPU,是个工厂,时刻运转着,工厂里有很多个车间(进程),一个车间开工其他车间不能开工,就是说:单核CPU一次只能运行一个进程.任何时候,CPU总是运行一个进程. 而一个车间里面有很多工人(线程),协同完成一个任务.所以:一个进程可以包括多个线程.车间空间是工人共享的,一个进程中的内存空…
浏览器环境 以下两段代码是等价的.req对事件的回调设置,实际上就是当前主线程任务队列的任务. var req = new XMLHttpRequest(); req.open('GET', url); req.onload = function (){}; req.onerror = function (){}; req.send(); //equal var req = new XMLHttpRequest(); req.open('GET', url); req.send(); req.o…
JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗时很长,后一个任务就需要一直等待.导致IO操作耗时,但CPU闲置,造成性能浪费. 如何解决: 异步.主线程可以不管IO操作,暂时挂起处于等待中的任务,先运行排在后面的任务.等到IO操作返回了结果,再回过头,把挂起的任务执行下去.于是,所有任务可以分为两种,一种是同步任务,另一种是异步任务. ps:当…
为什么JavaScript是单线程? JavaScript的一大特点就是单线程, 同一时间只能做一件事情,主要和它的用途有关, JavaScript主要是控制和用户的交互以及操作DOM.注定它是单线程. 假如是多个线程, 一个移除DOM节点,一个新增DOM节点,浏览器以谁的为准呢? 什么是执执行栈呢? 函数的调用就会形成一个栈帧.当执行栈都为空的时候,主线程就会处于空闲状态. function fn2(x, y) { return x + y } function fn1(z) { let a…