# 解题思路 or 实现原理
调用一个具有给定 this
值的函数, 以及作为一个数组(或类似数组对象)提供的参数。
首先
context
为可选参数, 如果不传的话默认上下文为window
接下来给
context
创建一个fn
属性, 并将值设置为需要调用的函数因为
apply
可以传入多个参数作为调用函数的参数, 所以需要将参数剥离出来然后调用函数并将对象上的函数删除
注意
注意: call()
方法的作用和 apply()
方法类似, 区别就是 call()
方法接受的是参数列表, 而 apply()
方法接受的是一个参数数组。
# 实现代码
/*
* @Author: Rainy
* @Date: 2020-04-09 19:02:51
* @LastEditors: Rainy
* @LastEditTime: 2020-08-08 16:49:24
*/
import { ObjectMap } from 'types';
// @ts-ignore
Function.prototype._apply = 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
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