1

在阅读本篇文章之前,您应该首先了解call方法和apply方法的用法以及es6中的扩展运算符...的使用。

1.call

当一个函数调用call方法时,call接收的的一个参数,将作为调用函数的this,调用函数本身的参数在call中从第二个形参开始,逐个接收。
call的用法不做详细介绍,下面是我的实现方法:

    Function.prototype.myCall = function (thisValue, ...args) {
            thisValue.fn = this;
            let res = thisValue.fn(...args);
            delete thisValue.fn;
            return res
        }
    const obj = {
            type: 'obj'
        }

     function getName() {
               return this.type
           }
           console.log(getName());
           console.log(getName.call(obj));
           console.log(getName.myCall(obj));

在myCall中传入了一个obj,obj将作为getName中的this来执行getName中的代码。
首先,将调用函数getName赋值给obj的一个属性上,thisValue.fn = this;,之后通过obj.fn(...args)就实现了this指向的改变,
然后将obj上添加的属性删除,最后返回函数执行结果。

2.apply

apply和call唯一的不同就是call就收原参数是逐个接收,apply是用数组接收。
fn.call(obj,param1,param2..)
fn.apply(obj,[pram1,param2,..])
apply的实现和call极其类似,不多做解释:

Function.prototype.myApply = function (thisValue, args) {
            thisValue.fn = this;
            //判断第二个参数是否有值(长度不为0的数组)
            let res = args && args.length ? thisValue.fn(...args) : thisValue.fn()
            delete thisValue.fn;
            return res
        }

forceddd
271 声望912 粉丝

一名前端爱好者。