apply 和call 函数的特性:
- 第一个参数改变this 指向
- 第一个参数为null时,默认this指向window
- apply 函数, 原函数参数以数组形式作为第二个参数;
- call函数, 原函数参数从第二个参数开始,依次罗列;
- 原函数有返回值时,apply 和 call 函数也要返回。
apply 和call 函数的实现要用到:
- this的执行上下文属性
- eval 函数执行js 语句
- arguments 为类数组
Function.prototype.apply = function (target) {
target = Object(target) || window; // 传入的target 为 null时,函数内部的this默认指向window;
target.fn = this; //将函数挂在到target的任意属性上
const args = arguments[1] || []; // 获取函数调用是的参数
const result = eval('target.fn(' + args.join(',') + ')'); // 执行函数
delete target.fn; //删除增加的属性
return result; //函数返回值
}
Function.prototype.call = function (target) {
target = Object(target) || window; // 传入的target 为 null时,函数内部的this默认指向window;
target.fn = this; //将函数挂在到target的任意属性上
const args =[];
for(let i =0;i<arguments.length;i++){
args.push(arguments[i]);
}
const result = eval('target.fn(' + args.join(',') + ')'); // 执行函数
delete target.fn; //删除增加的属性
return result; //函数返回值
}