Skip to content
  • 竞态条件

  • 解释 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 的区别

    1. Proxy 返回新的被监听的对象,
    2. Object.defineProperty 只能定义 get、set,Proxy 还可以对属性的 call、apply、has、in等进行代理;
    3. 不能监听数组的变化,如果属性值是对象,需要遍历
  • 私有属性的实现

    1. 形式上:命名下划线

    2. Symbol:的唯一性,一定程度上实现,但通过 Object.getOwnPropertySymbols() 依然可以获取数据;

    3. 使用 Proxy 加入代理层,对 get 进行操作;

      js
      const 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);
    4. 闭包:真正意义上的私有属性;

  • HTTP 多路复用

    • 并发加载资源对数量的限制可以通过多路复用解决;
  • canvas 是内联置换元素,内联元素是不能设置 width 和 height 的,但内联置换元素可以(<img/>),audio 和 video 是块元素;

  • 取消网络请求的方法:

    1. XMLHttpRequest:xml.abort()
    2. Fetch: AbortController
    3. Axios: CancelToken
  • Axios 源码中,拦截器是怎么实现的?

    • Axios拦截器链允许你在【发送请求之前】和【接收响应之后】对数据进行处理。这些拦截器按照特定的顺序执行,形成一个处理请求和响应的链条。

    • 拦截器链包括两种类型:

      • 请求拦截器:请求拦截器链中的拦截器按照逆序执行,最后注册的拦截器首先被调用
      • 响应拦截器:响应拦截器链中的拦截器按照正序执行。
    • Axios 的拦截器实现基于其内部的 InterceptorManager 类,该类维护了两个数组,分别用于存储请求拦截器和响应拦截器。

      • 每个拦截器都是一个包含 fulfilledrejected 函数的对象,这些函数分别对应于拦截器成功处理和拦截器处理出错的情况。
      • 拦截器的工作原理涉及到拦截器链的构建和执行。当 Axios 发起一个请求时,它会遍历请求拦截器数组,并将每个拦截器的 fulfilledrejected 函数加入到一个 Promise 链中。这个链随后被用来依次执行每个拦截器,直到到达请求发送的函数。响应拦截器的执行顺序与请求拦截器相反,它们在请求返回后被执行。

参考