# 设计模式
⚡ 30 秒速记
- 设计模式不是背类图,而是给反复出现的设计问题一套可复用的解法;目标都是把变化隔离,让代码高内聚、低耦合
- 先按问题选模式:对象怎么创建看创建型,模块怎么组合看结构型,对象怎么协作看行为型
- 前端高频抓住六个:单例管唯一实例,工厂藏创建细节,代理控制访问,策略替换算法,发布订阅解耦通信,适配器抹平接口差异
- 判断有没有用对:需求变化时,是新增一个实现/订阅者,还是到处修改旧分支;前者更接近“对扩展开放,对修改关闭”
- 加分点:模式有成本,简单问题直接写通常更清楚;出现重复变化、条件分支膨胀或模块强耦合时再引入
设计模式本质上是给重复出现的设计问题提供可复用方案,核心价值是隔离变化,让代码保持高内聚、低耦合。 创建对象的问题可以考虑创建型,模块组合看结构型,对象协作看行为型;前端常见的重点是工厂、代理、策略、发布订阅和适配器等。判断是否值得使用,要看需求变化时能否通过增加实现或订阅者完成扩展,而不是反复修改旧分支。模式本身也会增加抽象成本,简单逻辑直接实现通常更清楚,等到分支膨胀或模块强耦合时再引入更合适。
# 一、基础篇
# this、new、bind、call、apply
⚡ 30 秒速记
this由调用方式决定,不由函数定义位置决定;箭头函数没有自己的this,只捕获外层词法值- 判断顺序:
new绑定 →bind/call/apply显式绑定 → 对象方法隐式绑定 → 普通函数默认绑定 new会创建对象、连接原型、以新对象调用构造函数,并在构造函数未返回对象时返回这个新对象call/apply立即调用,区别只是参数列表与参数数组;bind返回永久绑定接收者的新函数- 边界:把对象方法直接交给回调会丢失接收者;类方法、事件回调和定时器里最常踩坑
普通函数的 this 由调用方式决定,而不是由声明位置决定;箭头函数没有自己的 this,会捕获外层的词法值。 判断时通常看 new 绑定、bind/call/apply 显式绑定、对象方法隐式绑定和普通函数默认绑定,优先级依次降低。new 会创建对象、连接构造函数原型并用新对象执行函数;构造函数没有返回其他对象时,最终返回该新对象。call 和 apply 会立即执行,区别是参数列表与参数数组,bind 则返回预先绑定接收者和部分参数的新函数。常见坑是把对象方法直接作为回调传递,此时调用形式改变,原来的接收者也就丢失了。
1. this 指向的类型
刚开始学习 JavaScript 的时候,
this总是最能让人迷惑,下面我们一起看一下在 JavaScript 中应该如何确定 this 的指向。this是在函数被调用时确定的,它的指向完全取决于函数调用的地方,而不是它被声明的地方(除箭头函数外)。当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this 就是这个记录的一个属性,它会在函数执行的过程中被用到。