call,apply,bind实现原理

 

共同点

JavaScript中的每一个function对象的原型上都会有call,apply和bind方法.都是用于改变函数运行时上下文,最终的返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。 

 

 call()

 

自己封装  call()的理解 B.call(A, args1,args2) 

unction.prototype.myCall = function(context){
    console.log(context)         // 相当于传进来的 cat对象
    context = context || window; // 有可能传进来null
    
    // 这里的this相当于dog.eat,相当于在cat对象上创建了一个方法
    context.fn = this;           // 
    
    var args = [];              // 接收其余的参数
    var res;                    // 返回结果  
    
    // 通过arguments接收其余传进来的参数
    for (var i = 1;i<arguments.length;i++){
        args.push(arguments[i])
    }
    
    res = context.fn(...args);   // 执行函数
    delete context.fn;
    return res;
}



dog.eat.myCall(cat,'猫粮','水');

 

apply()

B.apply(A,[args1,args2]);

Function.prototype.myApply = function(context,argsArr){
    context || context || window;
    context.fn = this;
    var args = [];
    var res;
    for(var i = 0;i<argsArr.length;i++){
        args.push(argsArr[i])
    }
    res = context.fn(...args)
    delete context.fn
    return res;
}

 

apply和call的区别:

在于将参数传递给函数。 call():使用其自有的实参列表作为函数的参数; apply():要求以数组的形式传入参数

 

 

bind

B.bind(A, args1,args2)(args3)

Function.prototype.myBind = function(context,...args){
        // =>THIS: FN(当前需要处理的函数)
	// => CONTEXT: OBJ(需要把FN中的THIS改为谁就传递谁);
	// => ARG: 传递哥FN的实参(数组); ["猫粮","水"]
	// 返回一个匿名函数
	
	/*
	 * 每次执行BIND,都形成一个不销毁的私有栈内存,返回一个新的匿名函数(每一次返回的不一样:不是相同的堆内存)
	 * 存储内容
	 * =>THIS: FN(当前需要处理的函数)
	 * => CONTEXT: OBJ(需要把FN中的THIS改为谁就传递谁);
	 * => ARG: 传递哥FN的实参(数组);	[ev]
	 *
	 * dog.eat = function anonymous(){    }
	*/ 
	
    let that = this;        // 此时的this相当于是当前需要处理的函数
    return function anonymous(...innerArg){
        that.apply(context,args.concat(innerArg)) 
    }
}

bind()和apply(),call()的区别

bind()返回一个函数,不会立即执行

apply(),call()会立即执行.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值