博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript的运行机制
阅读量:6476 次
发布时间:2019-06-23

本文共 1183 字,大约阅读时间需要 3 分钟。

###@JavaScript现在是单线程,以后也是 为什么要单线程,这是js用途决定的,js主要是面向用户提供各种交互,假如两个线程,一个线程操作这个Dom,另一个线程删除这个Dom,以哪个线程为主,还是要同步。

###@同步, 异步任务 在Js中所有的任务都可以分为同步任务和异步任务。其中同步任务在主线程中执行,形成一个执行栈;异步任务不进入主线程,而是进入异步队列,只有这个异步队列通知主线程,执行队列中的任务才能进入主线程执行。其中要说明的是:进入异步队列的任务,如果具备执行时机,就会在异步队列里添加一个消息事件,主线程每次执行完后,都在不断的循环查看异步队列是否有对应的消息事件,如果有,将异步队列中的任务放到主队列执行,没有,则继续循环查看。该主线程循环的过程也叫事件循环(Event Loop),其实可以看出,这依然是同步的。

Macrotask (宏任务),Microtask(微任务):Micro Task Queue,Tick Task Queue

异步任务可以分为宏任务和微任务,宏任务包括:setImmediate, setTimeout, setInterval;微任务包括:process.nextTick,Promise,Object.observe,MutaionObserver,其中Tick Task Queue专门存放微任务。 执行顺序:先执行微任务(Tick Task Queue优先),然后执行宏任务,然后清空当前所有微任务。 对于执行顺序,还有一点可以提下,多个process.nextTick语句总是在当前"执行栈"一次执行完,多个setImmediate可能则需要多次loop才能执行完。这正是Node.js 10.0版添加setImmediate方法的原因。

###@定时器,屏幕刷新频率 我们知道,setTimeout,setInterval都是异步任务。他们都要等到主线程的任务完成才调用执行,因此,执行的时间都会比其设定的时间晚一些,也就是说它的执行时间并不确定。 另外,介绍下屏幕刷新频率,即屏幕刷新的次数。一般来说是60hz,1000/60=16.67。 假设setTimeout 10ms执行一次。 0ms 屏幕未刷新 setTimeout未执行 10ms setTimeout回调执行,div.left = 1px;(伪代码,左移一像素) 16.7ms 屏幕刷新 div.left = 1px; 20ms setTimeout回调执行,div.left = 2px; 30ms setTimeout回调执行,div.left = 2px; 33.4ms 屏幕刷新 div.left = 3px; div.left=2px是不是丢失了。这叫丢帧,因此建议使用:requestAnimationFrame

转载地址:http://xvqko.baihongyu.com/

你可能感兴趣的文章
再次讨论javascript 中的this
查看>>
使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
查看>>
拉格朗日乘子法和KKT条件
查看>>
jquery的DataTable按列排序
查看>>
五子棋.html
查看>>
Day1 Spring初识(一)
查看>>
css pseudo classes
查看>>
深入浅出的webpack构建工具---webpack基本配置(一)
查看>>
rac各节点实例需设置为相同的一些参数
查看>>
acdream 1031 Component(树中一个大小为k的节点集最小权值)
查看>>
一些服务器客户端的c例子
查看>>
Font Creator Program 字库修改合并软件
查看>>
数值计算程序-特征值和特征向量 [转]
查看>>
setup_irq和request_irq(转)
查看>>
ORACLE中将一个值赋值到另一个表的值
查看>>
IE11将支持SPDY
查看>>
I.MX6 android mkuserimg.sh
查看>>
jQuery序列化后的表单值转换成Json
查看>>
linux添加开机启动项的方法介绍
查看>>
MonoTouch绑定CocoaTouch类库
查看>>