不传参数的情况下
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指向.
- 本文链接:http://horry233.github.io/2020/08/27/call-apply-%E5%92%8Cbind/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues