同步?异步?

86 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

进程:进程其实就是一个程序(简单可以理解为,浏览器打开一个页面就是开辟一个进程) 线程:线程是进程中去执行相关任务的 同步编程:只能一件事情一件事情的处理,上一件事情完成才能处理下一件事情。[一般是单线程] 异步编程:同时处理多件事情。[一般是因为多线程]

浏览器是多线程的,可以同时处理很多事情:

  • GUI渲染线程
  • JS引擎线程[JS引擎线程会把栈内存中的代码逐行解析执行]
  • 监听事件触发线程
  • 定时触发器线程
  • 异步HTTP请求线程
  • WebWorker
  • ... 浏览器利用多线程,完全可以同时处理很多事情,实现异步编程~

JS代码的执行是单线程的:因为浏览器只分配一个线程JS引擎线程(主线程)用来渲染和解析JS

  • JS中大部分代码都是同步的:如果此时主线程正在执行某些代码,那么其余的事情都做不了(例如:循环就是同步代码,如果JS出现死循环,那么主线程永远空闲不下来,其他的事情都处理不了,整个页面就会卡住)
  • JS中也有一部分代码是异步的:并不是像想象中的同时执行很多代码,而是基于EventLoop&浏览器的多线程机制实现监听、排队的机制 异步微任务:优先级高
  • requestAnimationFrame 实现JS动画
  • Promise.then | resolve/reject
  • await
  • queueMicrotask 创建一个新的异步微任务
  • IntersectionObserver 监听DOM元素和视口交叉的信息
  • MutationObserver 监听DOM元素属性改变
  • process.nextTick
  • ... 异步宏任务:优先级低
  • setTimeout/setInterval
  • 事件绑定
  • ajax/fetch异步数据请求
  • MessageChannel
  • setImmediate
  • ...