每日五问, Day6

115 阅读1分钟

new操作符具体做了什么

  • 创建一个新对象
  • 新对象绑定原型
  • 将构造函数的this指向新对象

谈下事件循环机制

  • js运行代码进入执行执行栈
  • 遇到setTimeout等内容会进入宏队列
  • 遇到Promise等产生的异步会进入微任务队列
  • 当前宏任务执行完成后会清空执行微任务队列
  • 然后进入下一次循环去把宏任务队列的任务取出一个去执行

实现一个promise

核心三要点

  • promise一共三个状态 pending resolved rejected 一旦更改不可逆转
  • then catch会返回一个新的promise
  • then catch在pending状态下会把回调存在队列中
class Promise {
    value;
    constructor(fn){
        this.status = 'pending'
        this.resolveCallbacks = []
        this.rejectCallback = []
        const handleResolve = (val) => {
            if(this.stsatus !== 'pending)return;
            this.value = val
            this.status = 'resolved'
            this.resolveCallbacks.forEach(fn=>fn())
        }
        const handleReject = (val) => {
            if(this.stsatus !== 'pending)return;
            this.value = val
            this.status = 'rejected'
            this.rejectCallback.forEach(fn=>fn())
        }
    
        try{
            fn(handleResolve,handleReject)
        }catch(error){
            handleReject(error)
        }
    }
    then(resolveFn, rejectFn){
           const _resolveFn = typeof resolveFn === 'function' ? resolveFn : v=>v
           const _rejectFn = typeof rejectFn === 'function' ? rejectFn : v=> throw v
           
           return Promise((resolve, reject)=>{
               try{
                   if(this.status==='resolve'){
                   connst v = _resolveFn(this.value)
                   resolve(v)
               }
               if(this.status==='rejected'){
                   const v = _rejectFn(this.value)
                   reject(v)
               }
               if(this.status==='pending'){
                   this.resolveCallbacks.push(()=>{
                       const v = _resolveFn(this.value)
                       resolve(v)
                   })
                   this.rejectCallback.push(_rejectFn)
               }
               }catch(error){
                   reject(error)
               }
           })
           
    }
    catch(rejectFn){
        return this.then(null, rejectFn)
    }
}

说下generator原理

  • 执行generator函数放回的是一个对象, 里面有next之类的方法
  • next 主要是获取value值, 获取value的方法, 主要通过swich/case
  • generator会有一个储存上下文的对象,
  • 第一次命中第一个case, 然后修改对象里的值,返回yield后面的值, 下次执行就会命中第二个case

介绍下盒子模型

  • 盒模型主要分为,content、pading、border、和margin
  • 垂直方向margin会重叠
  • bfc 不会发生margin重叠
  • flot也会参与计算高度