1. 计算机原理
1.进程:CPU资源分配的最小单位。即进程要有资源,好比一个小区,小区的居委会等。
2.线程:CPU调度的最小单位。好比小区里物业的每一个人。
2. 浏览器原理
1. GUI渲染引擎
1. 解析HTML、CSS、构建DOM树 => 布局 =>绘制
2. 与JS引擎互斥,当执行JS引擎线程时,GUI渲染引擎会pending,当任务队列空闲时,继续执行GUI。
2. Js引擎
1. 处理JS,解析执行脚本
2. 分配、处理、执行待执行的事件,event队列
3. 阻塞GUI渲染引擎。
3. 定时器触发引擎
1. 异步定时器的执行与处理 - setTimeout、setInterval
2. 接收JS引擎分配的异步定时器任务,并计数
3. 处理完成后,交于事件触发线程触发。
4. 异步HTTP请求引擎
1. 异步执行请求类处理 - Promise、ajax等
2. 接收JS引擎分配的请求类任务
3. 处理完成后,将回调交于事件触发线程触发。
5. 事件触发引擎
1. 接收来源:定时器、异步、用户
2. 将回调回来的任务一次放入任务队列的队尾,还给JS引擎。
3. JS执行顺序问题
1. 宏任务macro:script setTimeout setInterval I/O
2. 微任务micro: new Promise{}.then()
3. 顺序
1. Memory Heap来分配内存,Call Stack为调用栈,来执行异步回调,DOM、AJAX、setTimeout通过webApis来执行。
2. 执行时,同步任务直接放在主线程队列中执行,异步任务分为宏任务和微任务。
3. 当主线程队列为空时,就会激活event loop来轮询,宏任务优先级要大于微任务,即先去执行宏任务,执行前查看是否有可执行的微任务,若有宏任务被pending,放入event queue中等待,接着将微任务放入主线程队列中执行,结束后执行event queue中的宏任务。
4. Promise框架 - 规范
1. Promise有哪些状态? - pending 、 fulfilled 、 rejected
2. new Promise 执行器 executor() ,执行器参数有? - resolve、reject
3. promise的默认状态是? pending pf pr
4. promise成功,value保存成功的枚举
5. promise失败,reason保存失败
6. promise一定要有then,then接收两个回调onFulfilled(value)、onRejected(reason)
5. 手撕Promise
const FULFILLED = 'FULFILLED'
const REJECTED = 'REJECTED'
const PENDING = 'PENDING'
class xPromise{
constructor(executor){
this.status = PENDING
this.value = undefined
this.reason = undefined
let resolve = (value)=>{
if(this.status === PENDING){
this.status = FULFILLED
this.value = value
}
}
let reject = (reason) => {
if(this.status === PENDING){
this.status = REJECTED
this.reason = reason
}
}
try {
executor(resolve,reject)
} catch (error) {
reject(error)
}
}
then(onFulFilled,onRejected){
if(this.status === FULFILLED) {
onFulFilled(this.value)
}
if(this.status === REJECTED) {
onRejected(this.reason)
}
}
}
const FULFILLED = "FULFILLED";
const REJECTED = "REJECTED";
const PENDING = "PENDING";
class xPromise {
constructor(executor) {
this.status = PENDING;
this.value = undefined;
this.reason = undefined;
this.onFulFilledCallbacks = []
this.onRejectedCallbacks = []
let resolve = (value) => {
if (this.status === PENDING) {
this.status = FULFILLED;
this.value = value;
(this.onFulFilledCallbacks || []).forEach(fn => fn())
}
};
let reject = (reason) => {
if (this.status === PENDING) {
this.status = REJECTED;
this.reason = reason;
(this.onRejectedCallbacks || []).forEach(fn => fn())
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(onFulFilled, onRejected) {
if (this.status === FULFILLED) {
onFulFilled(this.value);
}
if (this.status === REJECTED) {
onRejected(this.reason);
}
if(this.status === PENDING) {
this.onFulFilledCallbacks.push(()=>onFulFilled(this.value))
this.onRejectedCallbacks.push(()=>onRejected(this.reason))
}
}
}