apply bind原理

apply 能改变函数this,它的内部原理

        Function.prototype.myApply = function(context){
    
    
            if(typeof this != 'function'){
    
     // 判断是否为函数
                console.log('not a function')
            }
            context.fn = this // 保存this,context 为window
            const result = context.fn(arguments[1]) // 调用函数
            delete context.fn
            return result
        }

和它类似的 bind 原理

     Function.prototype.myBind = function(context){
    
    
            if(typeof this != 'function'){
    
    
              throw new TypeError('not a function')
            }
            const _this = this // 保存this
            const args = Array.prototype.slice.call(arguments,1)
            return function F(){
    
    
                if(this instanceof F){
    
    
                // 判断是不是new出来的如果是
                // 返回一个空对象,且使创建出来的实例的__proto__ 指向
                //_this的prototype,且完成函数柯里化
                    return new _this(...args,...arguments)
                }
                else{
    
    
                    // 如果不是new出来的改变this指向,且完成函数柯里化
                    return _this.apply(context,args.concat(...arguments))
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_46433453/article/details/123445852
今日推荐