call ,apply ,bind 函数的模拟实现

  call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。

  apply 方法,类似,不同点在于, apply 方法传入的第二个参数 是一个数组, 

  

  实现步骤

  改变函数的his指向

  调用该方法

  删除方法

function foo(){
            console.log(this.name);
        }
        var obj = {} ;
        obj.name = "hei"
        // foo.call(obj)

Function.prototype.call3 = function(obje){
            obje.fn = this
            // 获取函数本身
            // 调用函数
            obje.fn()
            // 删除
            delete obje.fn
   }
  foo.call3(obj)

接下来是传入指定参数:

  

Function.prototype.call3 = function(obje,arg){
            obje.fn = this
            // 获取函数本身
            // 调用函数u
            obje.fn(arg)
            // 删除
            delete obje.fn
        }
        foo.call3(obj,"新参数")

但是参数 数量不一定 所以要使用 arguments,从第二个参数开始取

  

 Function.prototype.call3 = function(obje,arg,arg2){
            var args = []
            obje.fn = this
            for(var i=1;i <arguments.length; i++){
                args.push(arguments[i])
            }
            // 获取函数本身
            // 调用函数u
            obje.fn(...args)//es6 扩展符
            // 删除
            delete obje.fn
        }
       

  到这,基本完成, 但是还需要判断,当传入的 参数为 null  ,this 指向window 

猜你喜欢

转载自www.cnblogs.com/fmkeke/p/13170193.html