欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js手写call,apply,bind函数

程序员文章站 2022-07-14 14:19:02
...

首先是手写call函数,call函数第一个参数是this要指向的对象,第二及后面的参数就是原函数的参数

Function.prototype.myCall=function(context,...args){
    
    if(!typeof this==='function'){return;}//判断是否是函数调用
    
    context=typeof context==='object'?context:window;//判断传入的是否是对象,不是则为window
    var key=Symbol()
    
    context[key]=this;
    
    const result=context[key](...args)
    
    delete context[key];
    
    return result;}
    

接下来是apply函数,实际和call函数也差不多,只不过第二个参数是数组

Function.prototype.myApply=function(context,args){
    if(!typeof this==='object'){return;}
    
    context=typeof context=='object'?context:window;
     
    var key=Symbol();

    context[key]=this;

    const result=context[key](...args);

    delete context[key]

    return result;}

最后是bind函数,它不会立即执行,而是返回一个函数

Function.prototype.myBind=function(obj){
      var self=this;
      var args=Array.prototype.slice.call(arguments,1);
    var fn=function(){}
    var binds=function(){
        var that=this instanceof self?this:obj;
        return self.apply(that,args.concat(Array.prototype.slice.call(arguments));
    }
    if(this.prototype){
    fn.prototype=this.prototype}
    binds.prototype=new fn();
    return binds

}

 

相关标签: 前端 js