apply的实现
  - 前部分与call一样
 - 第二个参数可以不传,但类型必须为数组或者类数组
 
Function.prototype.myApply = function (ctx, args = []) {
  // 简单处理未传ctx上下文,或者传的是null和undefined等场景
  if (!ctx) {
    ctx = typeof window !== 'undefined' ? window : global
  }
  // 暴力处理 ctx有可能传非对象
  ctx = Object(ctx)
  // 用Symbol生成唯一的key
  const fnName = Symbol()
  // 这里的this,即要调用的函数
  ctx[fnName] = this
  // 将args展开,并且调用fnName函数,此时fnName函数内部的this也就是ctx了
  const result = ctx[fnName](...args)
  // 用完之后,将fnName从上下文ctx中删除
  delete ctx[fnName]
  return result
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18