(bind/call/apply)三者都是用来重新定义this这个对象的
一、三者的区别:
1、调用上
1 | let name ="www",age ="17"; |
首先我们可以看出,除了bind需要在方法后面添加”)”以外,其他的都是直接调用。这是因为bind()方法创建了一个新的函数,你必须调用显函数才会执行目标函数,而对于call和apply是使用后马上执行。
1、参数上
1 | let name ="www",age ="17"; |
可以看出,三个函数的第一个参数都是hs的指向对象,区别在于第二个参数。
- 对于Function.prototype.calL来说,第一个参数就是this的指向对象,其余参数是直接放进去,用逗号隔
开就好了。 - 对于Function.prototype.apply来说,Function.apply(obj,args)方法能接收两个参数,obj:是this的指向
对象。而args:这个是数组,它将作为参数传递,也就是说apply的所有参数都必须放在一个数组里面传进去 - 对于Function.prototype.bind来说,第一个参数就是this的指向对象,其余参数是直接放进去,用逗号隔
开就好了。也就是说他和cl1是基本相同的,除了是返回是一个函数。注意
对于bind来说,多次的bind调用,this的指向仍然是第一次的
function aa(){
console.log(this)
aa.bind(1).bind(2)()//1
一、bind / call / apply的异同
相同:都能改变this的指向,都是挂载在Function.prototype上
不同:call和apply是使用后马上执行,而bind是返回一个新的函数,调用显函数才会执行目标函数。并且call和
bind的参数格式是一样的,第一个参数是this的指向对象,其余参数用逗号,apply是参数需要放到数组中。
总结
关于修改this的指向的方法有三个,bind和call以及apply,他们的相同点都是能修改this的指向的问题的,并且都是挂载在Function.prototype上的。
不同点在于参数和执行上,call和bind的参数格式是一样的,第一个参数是this的指向对象,其余参数用逗号,而apply的参数需要放到数组中。在执行中,call和apply是使用后马上执行,而bind是返回一个新的函数,调用显函数才会执行目标函数。
其中需要注意的是,箭头函数的his是指向他所在的上下文中,并且是不能使用这三个方法修改的。