JavaScript执行机制

一、进程与线程

进程 描述了 CPU 在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。
线程 是进程中的更小单位,描述了执行一段指令所需的时间。
一个进程可以有多个线程。
进程
JS 是单线程执行的
在 JS 运行的时候可能会阻止 UI 渲染,这说明了 JS 引擎线程和渲染线程两个线程是互斥的。

二、执行栈

可以把执行栈认为是一个存储函数调用的栈结构,遵循先进后出的原则。
当我们执行 JS 代码的时候其实就是往执行栈中放入函数

三、浏览器中的 Event Loop

当遇到异步的代码时,会被挂起并在需要执行的时候加入到 Task(有多种 Task) 队列中。一旦执行栈为空,Event Loop 就会从 Task 队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说 JS 中的异步还是同步行为。
不同的任务源会被分配到不同的 Task 队列中,任务源可以分为** 微任务** (microtask) 和 ** 宏任务** (macrotask)。

微任务包括 process.nextTick ,promise ,MutationObserver。
宏任务包括 script , **setTimeout ,setInterval **,setImmediate ,I/O ,UI rendering。
Event Loop 执行顺序如下所示:

  1. 首先执行同步代码,这属于宏任务
  2. 当执行完所有同步代码后,执行栈为空,查询是否有异步代码需要执行
  3. 执行所有微任务
  4. 当执行完所有微任务后,如有必要会渲染页面
  5. 然后开始下一轮 Event Loop,执行宏任务中的异步代码,也就是 setTimeout 中的回调函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值