Apply/call/bind的原理是什么?bind、call、apply 区别?如何实现一个bind?

本文主要介绍了JavaScript中的bind、call和apply方法的区别,包括bind不会立即执行,返回的是一个函数,this指向可自定义;call和apply会立即执行,this指向第一个参数,apply接受参数数组。同时详细讲解了这些方法的实现原理。
摘要由CSDN通过智能技术生成

call,apply,bind的区别

1.bind

bind与call或apply最大的区别就是bind不会被立即调用,而是返回一个函数,函数内部的this指向与bind执行时的第一个参数,而传入bind的第二个及以后的参数作为原函数的参数来调用原函数

比如:

let obj = {
  name: 'zhangsan',
  fn: function (a, b, c) {
    console.log(this.name, a, b, c)
  }
}
window.name = '张三'

let nFn = obj.fn.bind(window, '第一个参数')
nFn('第二个参数', '第三个参数') 
// 最后输出:张三,第一个参数,第二个参数,第三个参数

以上就是我们在bind的时候之传入了一个参数,然后在执行这个bind之后的新函数(这里后面就称之为绑定函数)又传入了两个参数,其实这中间有一个过程就是参数合并,合并后的顺序就是相当于把bind执行的第二个参数及之后参数与新绑定函数参数做了一个合并,新绑定函数参数会基于bind方法函数第二个参数及之后参数结束位置开始进行合并

还要注意一个地方,就是通过new关键字去实例这个绑定函数时,也就是通过new的方式创建一个对象,bind()函数在this层面上是没有效的,但是在参数层面上是有效的

2.apply和call的调用会立即返回函数执行结果,如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是一个参数数组,call的第二个及其以后的参数都是数组里面的元素,就是说要全部一一单独列举出来;

func.call(thisOrg,arg1,arg2,.....);
func.apply(thisOrg,[org1,org2,...]);

call&apply&bind方法的简单实现

call

Function.prototype.call = function(aa,...args){
// 如果第一个参数为null 或者undefined,则默认指向window
// 这里绑定call方法的this指向
	const aa = aa || window;
// 将this赋给context的fn属性,此处this是指调用call的function(这话有点绕口自己理解)
	// 例如:Array.propotype.slice.call(null,arg1)
	// 那么this=Array.propotype.slice
	// 同理aa.fn = Array.propotype.slice;
	// aa.fn的fn里面的this自然指向ctx
	aa.fn = this;
	let result;
	result = aa.fn(...args);
	delete aa.fn;
	return result;
}

apply

Function.prototype.apply = function(aa,...args){
	const aa = aa || window;
	aa.fn = this;
	let result;
	if(args.length){
		result = aa.fn(...args);
		delete aa.fn;
	}else{
		result = aa.fn();
	}
	return result;
}

bind

Function.prototype.bind = function(aa){
	const _this = this;
	var args = [...arguments].slice(1);
	return function(){
		_this.apply(aa,args.concat(...arguments))
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值