手写call、apply、bind函数
call
、apply
、bind
三者均能改变当前this
指向
三者的区别:
- 三者的第一个参数均为新的
this
指向 - 第二个参数:
call
和bind
为参数列表,apply
为参数数组 - 只有
bind
返回一个函数
手写实现call
函数
Function.prototype.TestCall = function(thisArg,arg){
//获取要执行的函数
let fn = this;
//转换新this指向的类型
thisArg = (thisArg !== null && thisArg !==undefiend) ? Object(thisArg) : window;
thisArg.fn = fn;
//将函数执行的结果保存
let result = thisArg.fn(...arg);
//删除
delete thisArg.fn;
//返回函数执行的结果
return result;
}
手写实现apply
函数
Function.prototype.TestApply = function(thisArg, arrArg){
let fn = this;
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window;
thisArg.fn = fn;
//arrArg = arrArg ? arrArg : [];
arrArg = arrArg || [];
let result = thisArg.fn(...arrArg);
delete thisArg.fn;
return result;
}
手写实现bind
函数
Function.prototype.TestBind = function(thisArg, ...argArr){
let fn = this;
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window;
function proxyFn (...args){
let finalArr = [...argArr, ...args];
thisArg.fn = fn;
let result = thisArg.fn(...finalArr);
delete thisArg.fn;
return result;
}
return proxyFn;
}