不传参数的情况下

var obj = {
    name:"小明",
    objAge:this.age,
    myFun:function() {
        console.log(this.name+ "年龄" + this.age);
    }
}
var messi = {
    name:"梅西",
    age:33
}
obj.myFun.call(messi);// 梅西年龄33
obj.myFun.apply(messi);// 梅西年龄33
obj.myFun.bind(messi)();// 梅西年龄33

在不传参数的情况下,call和apply的使用没有区别,bind要再加上一个()

因为bind,他的返回值是一个新的函数,所以再要一个(),来调用他的新函数

在传参的情况下

var obj = {
    name:"小明",
    objAge:this.age,
    myFun:function(from,to) {
        console.log(this.name+ "年龄" + this.age, "来自" + from + "去往"+ to);
    }
}
var messi = {
    name:"梅西",
    age:33
}
obj.myFun.call(messi,"巴萨","曼城");// 梅西年龄33 来自巴萨去往曼城
obj.myFun.apply(messi,["巴萨","曼城"]);// 梅西年龄33 来自巴萨去往曼城
obj.myFun.bind(messi,"巴萨","曼城")();// 梅西年龄33 来自巴萨去往曼城
obj.myFun.bind(messi,["巴萨","曼城"])();// 梅西年龄33 来自巴萨,曼城去往undefined

call apply bind 的第一个参数(messi),都是this的指向对象

而后面的参数,

call的接收方式是直接传进去,后面的参数用逗号隔开

apply的参数是全部放到一个数组里面,然后传数组进去

bind的接收方式和call一样,如果传的是个数组,则只会识别第一个元素

call()

call()方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向

应用场景: 经常做继承. (在没有类以前)

apply()

apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

应用场景: 经常跟数组有关系

bind()

bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数

如果只是想改变 this 指向,并且不想调用这个函数的时候,可以使用bind

应用场景:不立刻调用函数,但是还想改变this指向

call、apply、bind三者的异同

  • 共同点 : 都可以改变this指向
  • 不同点:

    • call 和 apply 会调用函数, 并且改变函数内部this指向.
    • call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
    • bind 不会调用函数, 可以改变函数内部this指向.