竞态条件
解释 bind, call, apply
- bind 创建新的函数,call、apply执行函数;
- bind、call接受参数列表,
apply接受数组作为参数; - 应用场景:类数组对象使用数组的方法,如
arguments是类数组对象,但没有forEach方法,通过Array.prototype.forEach.call(arguments, function(){...})实现。也可以将数组的方法用于string对象。
函数调用的4种方法
- 普通函数调用
- 方法调用
- 构造函数
- 作为函数方法调用(call、bind、apply)
Object.defineProperty 与 Proxy 的区别
- Proxy 返回新的被监听的对象,
- Object.defineProperty 只能定义 get、set,Proxy 还可以对属性的 call、apply、has、in等进行代理;
- 不能监听数组的变化,如果属性值是对象,需要遍历
私有属性的实现
形式上:命名下划线
Symbol:的唯一性,一定程度上实现,但通过 Object.getOwnPropertySymbols() 依然可以获取数据;
使用 Proxy 加入代理层,对
get进行操作;jsconst proxy = function(target){ return new Proxy(target, { get(target, key){ if(key.startWith('_')){ throw new Error('private key!'); } return Reflect.get(target, key); } }); } let obj = { // 以下划线开头的属性名被作为私有属性 ['_name']: 'czl' } obj = proxy(obj);闭包:真正意义上的私有属性;
HTTP 多路复用
- 并发加载资源对数量的限制可以通过多路复用解决;
canvas 是内联置换元素,内联元素是不能设置 width 和 height 的,但内联置换元素可以(
<img/>),audio 和 video 是块元素;取消网络请求的方法:
- XMLHttpRequest:xml.abort()
- Fetch: AbortController
- Axios: CancelToken
Axios 源码中,拦截器是怎么实现的?
Axios拦截器链允许你在【发送请求之前】和【接收响应之后】对数据进行处理。这些拦截器按照特定的顺序执行,形成一个处理请求和响应的链条。
拦截器链包括两种类型:
- 请求拦截器:请求拦截器链中的拦截器按照逆序执行,最后注册的拦截器首先被调用
- 响应拦截器:响应拦截器链中的拦截器按照正序执行。
Axios 的拦截器实现基于其内部的
InterceptorManager类,该类维护了两个数组,分别用于存储请求拦截器和响应拦截器。- 每个拦截器都是一个包含
fulfilled和rejected函数的对象,这些函数分别对应于拦截器成功处理和拦截器处理出错的情况。 - 拦截器的工作原理涉及到拦截器链的构建和执行。当 Axios 发起一个请求时,它会遍历请求拦截器数组,并将每个拦截器的
fulfilled和rejected函数加入到一个 Promise 链中。这个链随后被用来依次执行每个拦截器,直到到达请求发送的函数。响应拦截器的执行顺序与请求拦截器相反,它们在请求返回后被执行。
- 每个拦截器都是一个包含