(bind/call/apply)三者都是用来重新定义this这个对象的
一、三者的区别:
1、调用上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let name ="www",age ="17";
let obj = {
name:"aaa";
objAge:this.age;
myFun:function (){
console.log(this.name+"年龄"+this.age)
}
}
let db = {
name:"bbb";
age:12
}
obj.myFun.call(db)//bbb年龄99
obj.myFun.apply(db);//bbb年龄99
obj.myFun.bind(db)();//bbb年龄99

首先我们可以看出,除了bind需要在方法后面添加”)”以外,其他的都是直接调用。这是因为bind()方法创建了一个新的函数,你必须调用显函数才会执行目标函数,而对于call和apply是使用后马上执行。
1、参数上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let name ="www",age ="17";
let obj = {
name "aaa",
objAge this.age,
myFun:function(fm,t){
console.log(this.name+"年龄"+this.age,"来自"+fm+"去往"+t)
}
}
let db={
name:"bbb",
age:12
}
obj.myFun.call(db,'成都''上海');//bbb年龄99来自成都去往上海
obj.myFun.apply(db,['成都''上海']);//bbb年龄99来自成都去往上海
obj.myFun.bind(db,'成都''上海')();//bbb年龄99来自成都去往上海
obj.myFun.bind(db,['成都''上海'])();//bbb年龄99来自成都,上海去往undefined

可以看出,三个函数的第一个参数都是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是指向他所在的上下文中,并且是不能使用这三个方法修改的。