bind call apply的区别
三者都是用来绑定this的指向的,平时写公用库的时候使用的比较多,接下来我们一起看下他们的使用
bind的使用
bind的第一个参数就是要指定的this对象,后面的参数会依次传入到要绑定this的方法中的,但是需要注意bind绑定this后不会立即执行,而是返回一个绑定this对象以后的一个方法,需要手动执行
let bindObj1 = {
name: '大脚',
age: '41',
init: function(sex, card) {
console.log(`我是${this.name},性别${sex},今年${this.age}岁,我的身份是${card}`)
}
}
bindObj1.init('女', '超市老板') // 我是大脚,性别女,今年41岁,我的身份是超市老板
let bindObj2 = {
name: '刘英',
age: '31'
}
let bindFun = bindObj1.init.bind(bindObj2, '女', '花圃老板娘')
bindFun() // 我是刘英,性别女,今年31岁,我的身份是花圃老板娘
call的使用
call的第一个参数就是要指定的this对象,后面的参数会依次传入到要绑定this的方法中的,但是需要注意call绑定this后会立即执行,不需要手动执行
let callObj1 = {
name: '赵四',
age: '41',
init: function(sex, card) {
console.log(`我是${this.name},性别${sex},今年${this.age}岁,我的身份是${card}`)
}
}
callObj1.init('男', '赵玉田他爹兼职象牙山舞王') // 我是赵四,性别男,今年41岁,我的身份是赵玉田他爹
let callObj2 = {
name: '王美兰',
age: '40'
}
callObj1.init.call(callObj2, '女', '赵玉田他妈') // 我是王美兰,性别女,今年40岁,我的身份是赵玉田他妈
apply的使用
apply的第一个参数就是要指定的this对象,需要注意的是apply只有两个参数,第二个参数是一个数组,数组里面的元素会依次传入到要绑定this的方法中的,apply绑定this后会立即执行,不需要手动执行
let applyObj1 = {
name: '刘能',
age: '41',
init: function(sex, card) {
console.log(`我是${this.name},性别${sex},今年${this.age}岁,我的身份是${card}`)
}
}
applyObj1.init('男', '刘英他爹兼职象牙山小诸葛') // 我是刘能,性别男,今年41岁,我的身份是刘英他爹兼职象牙山小诸葛
let applyObj2 = {
name: '李秀莲',
age: '40'
}
applyObj1.init.apply(applyObj2, ['女', '刘英他妈']) // 我是李秀莲,性别女,今年40岁,我的身份是刘英他妈
总结
bind, call, apply相同点
- 三个都可以用于改变this指向
- 三个方法的第一个参数都是要指向的this对象
- 三个都可以对绑定的方法进行传参
bind, call, apply不同点 - apply只有两个参数,第二个参数需要传入数组,数组中的元素会依次传入方法中,bind和call可以有多个参数并且依次传入方法中
- apply和call会立即执行方法,bind会返回一个方法需要手动执行