Javascript是一门单线程的非阻塞的脚本语言
- 单线程:任何时候都只有一个主线程来处理所有的任务。
- 非阻塞:当代码需要执行异步任务时,主线程会先挂起(pending)该任务,等异步任务返回结果后再根据一定的规则去执行相应的回调。
- JS主要用途:是与用户互动,以及操作DOM。
进程和线程的关系
进程:程序的一次执行,占有一片独有的内存空间
线程:CPU的基本调度单位,是程序执行的一个完整流程
关系:
- 一个进程中一般至少有一个运行的线程:主线程
- 一个进程中也可以同时运行多个线程,说明程序是多线程运行的。
- 多个进程之间的数据是不能同时直接共享的。
宏任务(macrotask):
整个script标签异步 Ajax 请求setTimeout()setInterval()文件操作
微任务(microtask):
promise.then()Async/await(Promise)process.nextTickqueueMicrotask()new MutaionObserver()
执行顺序:主线程 —— 微任务队列 —— 宏任务队列
EventLoop执行过程:
- 同步任务由 JavaScript 主线程次序执行
- 异步任务委托给宿主环境执行
- 已完成的异步任务对应的回调函数,会被加入到任务队列中等待执行
- JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行
- JavaScript 主线程不断重复上面的第 4 步
JavaScript 主线程从“任务队列”中读取异步任务的回调函数,放到执行栈中依次执行。这个过程是循环不断的,所以整个的这种运行机制又称为 EventLoop(事件循环)。
1117

被折叠的 条评论
为什么被折叠?



