# 模拟实现call/apply函数

首先弄懂call/apply函数的作用就是改变函数的this指向

使用举例:

function test(name,age){
    return name+"---"+age;
}
let obj = {};
test.call(obj,"wlk",25);  // wlk---25

实现思路:

  1. 将函数设为指定对象的属性
  2. 执行该函数
  3. 删除指定对象上的函数

初步实现:

// 0.由于call函数的调用形式,所以需要绑定到函数的原型上,保证所有函数都能调用call 
Function.prototype.myCall = function(thisArg,...args){
    // 1. 将函数绑定为指定对象的属性
    thisArg.fn = this; // this 就是调用myCall的函数。
    // 2. 执行函数
    thisArg.fn();
    // 3. 删除指定对象上的函数
    delete thisArg.fn
}

考虑如下情况:

  1. 调用call的函数,可能有返回值
  2. 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的函数有返回值情况处理
}
作者:王龙楷; 标签:原创; 提交时间: 7/30/2020, 3:05:40 PM