JS三座大山_单线程&EventLoop
2021-03-02 16:30
标签:代码执行 render nod 更新 异步 时间片 -- 本质 web 主线程可以不管IO操作,暂时挂起处于等待中的任务,先运行排在后面的任务。等到IO操作返回了结果,再回过头,把挂起的任务执行下去。于是,所有任务可以分为两种,一种是同步任务,另一种是异步任务。 MacroTask(Task): 宏任务。整体代码的script、setTimeout、setInterval、 setImmediate、requestAnimationFrame、I/O、UI rendering; MicroTask:微任务。process.nextTick(Node环境中),Promise,Object.observe(基本废弃),MutationObserver. 执行宏任务(先进先出),一次循环只执行一个宏任务 执行栈:同步任务顺序执行,异步方法交给异步处理模块 执行栈为空时,取出微任务执行(先进先出),直到微任务队列为空 渲染更新: *JS是单线程执行的,而基于事件循环模型,形成了基本没有阻塞(除了alert或同步XHR等操作)的状态。 执行结果:4 2 3 1 JS三座大山_单线程&EventLoop 标签:代码执行 render nod 更新 异步 时间片 -- 本质 web 原文地址:https://www.cnblogs.com/nanhuaqiushui/p/14406133.htmlJS三座大山_单线程&EventLoop
JavaScript是单线程、单并发、非阻塞语言
单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务。
单线程背景:浏览器执行环境中,若多线程同时对同一DOM进行操作,无法保证程序执行一致性。
引发的问题:
如何解决:
方案一:异步。
ps:当主线程阻塞时,任务队列仍然能被推入任务。方案二:web worker
非阻塞。事件驱动程序模型基本的实现原理基本上都是事件循环Event Loop.
1.JavaScript内存模型:
2.JavaScript代码执行机制:
3.Event Loop
执行步骤:
更新UI渲染。完成一轮循环,反复执行1-4步
在一轮Event
Loop中多次修改同一DOM,只有最后一次会进行绘制;
渲染更新会在Event Loop的tasks和microTasks完成后进行。但并不是每轮Event Loop都会更新渲染,浏览器有自己的机制来确定是否要更新渲染。如果在一帧(16.7ms)里多次修改DOM,浏览器只会渲染绘制一次。
如果希望每轮Event Loop都即时呈现变动,可以使用requestAnimationFrame规范:
tasks are scheduled,所以浏览器可以从内部到JS/DOM,保证动作按序发生。4.JS的运行环境:浏览器 & Node
setTimeout(function(){
console.log(1);
});
new Promise(function(resolve){
console.log(2);
resolve();
}).then(function(){
console.log(3);
});
console.log(4);
分析:
浏览器更新渲染,再去宏任务队列中取出嘴来的任务推入执行栈中执行,循环以上步骤,所以输出1.5.使用
上一篇:JavaFx监听进度条
下一篇:009.NET5_程序的发布运行