Appearance
call、apply、bind 的区别
call
call可以调用函数
js
function func() {}
func.call()call可以改变函数中this的指向
js
function func() {
console.log(this.name)
}
let cat = {
name: 'bigc'
}
func.call(cat)
// bigc不光函数,方法也能用。
js
function func() {
console.log(this.name)
}
let dog = {
name: 'mk',
sayName() {
console.log(`我是 ${this.name}`)
}
}
let cat = {
name: 'bigc'
}
dog.sayName.call(cat)
// 我是 bigc还可以传参。call 从第二个参数开始,都是给原函数传参。
js
function func() {
console.log(this.name)
}
let dog = {
name: 'mk',
sayName() {
console.log(`我是 ${this.name}`)
},
eat(food) {
console.log(`我吃 ${food}`)
}
}
let cat = {
name: 'bigc'
}
dog.eat('奶片')
// 我吃奶片
dog.eat.call(cat, '巧克力')
// 我吃巧克力apply
和 call 的区别只有传参不一样。
apply 的第二个参数是数组方式的参数列表
js
function func() {
console.log(this.name)
}
let dog = {
name: 'mk',
sayName() {
console.log(`我是 ${this.name}`)
},
eat(food, drink) {
console.log(`我吃 ${food},我喝 ${drink}`)
}
}
let cat = {
name: 'bigc'
}
dog.eat('奶片', '牛奶')
// 我吃奶片,我喝牛奶
dog.eat.apply(cat, ['巧克力', '洗脚水'])
// 我吃巧克力,我喝洗脚水bind
bind 不会调用原函数,会把改变 this 指向后的结果返回。
js
const newFn = dog.eat.bind(cat, '巧克力', '洗脚水')
newFn()
// 我吃巧克力,我喝洗脚水WARNING
猫不能吃巧克力和喝洗脚水。大 C 愿意这么干,但我不会让他得逞。