javaScript中call、apply、bind的手动实现

1、call方法,fn1.call(fn2,参1,参2....)

    function add(num1, num2) {
		console.log(this,"<----add");
		console.log(num1 + num2);
	}
	function sub(num1, num2) {
		console.log(this,"<----sub");
		console.log(num1 - num2);
	}
	Function.prototype.myCall = function(context) {
		const args = [...arguments].slice(1)  //截取出入参
		context = context || window   //如果context未传,则默认为window
		context.fn = this   //这里的this指调用者,add调用mycall,所以this指向add,
							//往context上增加一个中间属性fn,指向this,this就是add函数
		const results = context.fn(...args)  //将剩余参数传入,此时调用者为context,
											//即sub调用了fn
		return results
	}
	add.myCall(sub,5,2)

从打印结果可以看出,add中的this变成了函数sub,已经指向了传入函数。 

2、apply方法,fn1.apply(fn2,【参1,参2....】) 

    Function.prototype.myApply = function (context) {
		let result = null;
		context = context || window;
		context.fn = this;
		if (arguments[1]) {
			result = context.fn(...arguments[1]);
		} else {
			result = context.fn();
		}
		return result;
	};
	function Add(num1, num2) {
		console.log(this,"<------add");
		console.log(num1 + num2);
	}
	function Sub(num1, num2) {
		console.log(this,"<------sub");
		console.log(num1 - num2);
	}
	Add.myApply(Sub, [6, 3]);

同call一般,apply传递数组的处理方式相近,此时打印结果,依然完成实现。

3、bind方法,fn = fn1.bind(fn2,参1,参2.....)

      Function.prototype.myBind = function (context) {
        // 获取参数
        var args = [...arguments].slice(1), // [1,5]
          fn = this;   //fn指向调用者this(add)
        // console.log(this);//Add
        return function Fn() {
          //对实际调用的传参进行处理
          const bindArgs = Array.prototype.slice.call(arguments)
          // console.log(this); //Window
          return fn.apply(context, args.contact(bindArgs));//将后传的参数拼接进去
        };
      };
      function Add(num1, num2) {
        console.log(this);
        console.log(num1 + num2);
      }
      function Sub(num1, num2) {
        console.log(num1 - num2);
      }
      var newFun = Add.myBind(Sub, 1, 5);
      newFun(3);   //返回的函数在实际调用时,也可以传参

 bind函数返回的是一个新函数,在实现时候借用了apply方法。(注意返回的函数在实际调用时,也可以传参)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值