闭包:一个内层函数中访问到其外层函数的作用域 就是闭包
原型:每个函数可有一个特殊的属性叫原型prototype,
原型连:原型对象也可能拥有原型,并从中继承方法和属性,一层一层,以此类推,这种关系就叫原型连 比如一个构造函数a存在原型对象a.prototype 构造函数生成实例对象b,b的__proto__指向构造函数a原型对象就是a.prototype a.prototype.__proto__指向内置对象object.prototype object.prototype.__proto__指向null,这是原型连的终点
new关键字主要做了以下工作: 创建一个新对象obj 将对象与构造函数通过原型连连接起来 将构造函数中的this绑定到新建的对象obj上 指向构造函数内代码,为对象添加属性和方法 将这个新创建的对象返回
事件循环-eventloop 任务划分为宏任务与微任务 执行代码的时候,会先执行宏任务,然后遇其他宏任务,就把宏任务放到宏任务队列中 在当前宏任务执行中遇到的微任务,把微任务放到微任务队列里面,等到宏任务执行完后,会执行当前宏任务的微任务 执行完之后,又回去宏任务队列执行第二个宏任务,并走以上流程,这个便是事件循环
节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次执行 防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时
vue2双向绑定原理: 通过数据劫持+发布者-订阅者模式的方式来实现, 首先设置一个监听器(Observer),通过object.defineProperty()方法来劫持数据的setter和getter方法, 再利用compile解析器对每个节点元素进行扫描和解析,找到其中动态绑定的数据,从data中获取并初始化视图 同时初始化一个订阅者watcher,并添加更新回调函数, 当数据变化时,会先找到对应的消息订阅器dep,然后通知watcher去执行更新函数
vue3双向绑定原理优化:使用proxy代理,代理整个对象而不是对象属性,那么就能监听到对象属性的增删改
Block Tree是一个非常大的更新,是为了解决新旧节点对比的效率问题。vue2在对比新旧数的时候,并不知道哪些节点时静态的,哪些节点时动态的,因此只能一层一层比较,这就浪费了大部分时间在对比静态节点上。 而vue3对节点进行了标记 PatchFlags