# 解题思路 or 实现原理

使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

  • 首先 context 为可选参数,如果不传的话默认上下文为 window

  • 接下来给 context 创建一个 fn 属性,并将值设置为需要调用的函数

  • 因为 call 可以传入多个参数作为调用函数的参数,所以需要将参数剥离出来

  • 然后调用函数并将对象上的函数删除

# 实现代码

/*
 * @Author: Rainy
 * @Date: 2019-11-14 19:25:01
 * @LastEditors: Rainy
 * @LastEditTime: 2020-04-09 19:00:57
 */

import { ObjectMap } from 'types';

// @ts-ignore
Function.prototype._call = function(context: ObjectMap<any>, ...arg: any): any {
  /* istanbul ignore next */
  if (typeof this !== 'function') {
    throw new TypeError('Error');
  }

  /* istanbul ignore next */
  context = context ? Object(context) : window

  context.fn = this;

  const result = context.fn(...arg);

  delete context.fn;

  return result;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 参考

call (opens new window)