手写 call
call 和 apply 的区别:call 方法接收的是一个参数列表,apply 方法接收的是一个包含多个参数的数组。
1.*context* 存在就使用 *context*,否则是 *window*
2.使用 *Object(context)* 将 *context* 转换成对象,并通过 *context.fn* 将 *this* 指向 *context*
3.循环参数,注意从 1 开始,第 0 个是上下文,后面才是我们需要的参数
4.将参数字符串 *push* 进 *args*
5.字符串和数组拼接时,数组会调用 *toString* 方法,这样可以实现将参数一个个传入,并通过 *eval* 执行
6.拿到结果返回前,删除掉 *fn*
Function.prototype.call = function(context) {
context = context ? Object(context) : window;
context.fn = this; let args = [];
for (let i = 1; i < arguments.length; i++) {
args.push('arguments['+ i +']');
}
let res = eval('context.fn('+ args +')');
delete context.fn; return res;
}<