手写call、apply、bind

86 阅读1分钟

call 、apply 、bind 可用于更改函数中的this,这三个函数的第一个参数都是 this 的指向对象

call、apply会立即执行原函数,返回值的逻辑和原函数相同

bind不会执行原函数,返回的是this变更过后的函数

        // 接受一个引用类型数据obj作为this参数
        Function.prototype.myCall = function (obj, ...arguments) {
            // 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
            if (typeof obj !== "object") obj = window
            obj.tempCall = this // 改变this指向
            const ret = obj.tempCall(...arguments) // 剩余参数
            delete obj.tempCall
            return ret
        }

        // 接受一个引用类型数据obj作为this参数
        Function.prototype.myApply = function (obj, argArr) {
            // 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
            if (typeof obj !== "object") obj = window
            obj.tempCall = this // 改变this指向
            const ret = obj.tempCall(...argArr)
            delete obj.tempCall
            return ret
        }

        // 接受一个引用类型数据obj作为this参数
        Function.prototype.myBind = function (obj, ...arg1) {
            // 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
            if (typeof obj !== "object") obj = window
            tempCall = this // 改变this指向

            return function (...arg2) {
                return tempCall.myCall(obj, ...arg1, ...arg2) // 剩余参数
            }
        }