我们先来了解call的方法以及使用,只要了解了call,那么apply和bind就非常好理解了
call是一个方法,是函数的方法
call可以调用函数,可以改变this的指向
改变this指向:
我们创建两个对象dog和cat,当调用dog.sayName()时控制台打印的为我是旺财,如果加上.call(),把cat传进去,这个时候打印的就是我是喵喵,可以看到this的指向改变了,指向了cat
let dog = {
name: '旺财',
sayName() {
console.log('我是' + this.name)
},
}
let cat = {
name: '喵喵',
}
dog.sayName()//我是旺财
dog.sayName.call(cat)//我是喵喵
我们稍作改动,在dog中再加上eat方法并进行传参,我们在调用时不仅想要调用dog中的eat方法,还想对其进行传参,那么只需要在传入的cat后继续传入即可
let dog = {
name: '旺财',
sayName() {
console.log('我是' + this.name)
},
eat(food1, food2) {
console.log('我喜欢吃' + food1 + food2)
},
}
let cat = {
name: '喵喵',
}
dog.eat.call(cat, '鱼', '老鼠')//我喜欢吃鱼老鼠
下面我们借助以上代码,了解一下bind,apply和call的三者相同点与不同点
dog.eat.call(cat, '鱼', '老鼠')//我喜欢吃鱼老鼠
这行代码用apply表示为dog.eat.apply(cat, ['鱼', '老鼠'])可以看出我们在使用apply时进行传参需要以数组的形式,那就说明apply也会调用函数,改变this指向
这行代码用bind时dog.eat.bind(cat, '鱼', '老鼠'),控制台会空白,无输出内容,说明方法并没有被调用,
let fun = dog.eat.bind(cat, '鱼', '老鼠')
fun()
等同于
dog.eat.call(cat, '鱼', '老鼠')
也就是说bind不会调用函数,可以改变this指向,传参方式与call相同 apply会调用函数,可以改变this指向,传参方式是以数组的执行