# 模拟实现call/apply函数
首先弄懂call/apply函数的作用就是改变函数的this指向。
使用举例:
function test(name,age){
return name+"---"+age;
}
let obj = {};
test.call(obj,"wlk",25); // wlk---25
实现思路:
- 将函数设为指定对象的属性
- 执行该函数
- 删除指定对象上的函数
初步实现:
// 0.由于call函数的调用形式,所以需要绑定到函数的原型上,保证所有函数都能调用call
Function.prototype.myCall = function(thisArg,...args){
// 1. 将函数绑定为指定对象的属性
thisArg.fn = this; // this 就是调用myCall的函数。
// 2. 执行函数
thisArg.fn();
// 3. 删除指定对象上的函数
delete thisArg.fn
}
考虑如下情况:
- 调用call的函数,可能有返回值
- this值传
null
最终实现:
Function.prototype.call2 = function(thisArg,...args){
let context = thisArg || window; // this值传null时,指向window
// 1. 将目标函数指定为对象的属性temp
context.temp = this;
// 2. 对象调用函数的形式执行目标函数
let result = context.temp(...args);
// 3. 删除该属性,保证对象原样
delete context.temp;
return result; // 调用call的函数有返回值情况处理
}