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

Posted fmkeke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

以上是关于call ,apply ,bind 函数的模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

call() apply() bind()方法 以及实现bind()方法

原生JS实现call,apply,bind函数

js 手动实现bind方法,超详细思路分析!

学习Javascript之模拟实现bind

原生实现JavaScript的call()apply()bind()

原生实现JavaScript的call()apply()bind()