改变this指向的常用方法:call,apply,bind
- call:改变this指向,自动执行函数
- apply:改变this指向,自动执行函数
- bind:改变this指向,不会自动执行函数,需要手动执行
举例子:
var obj1 = {
name: 'csdn1',
getName(){
console.log(this.name)
}
}
var obj2 = {
name: 'csdn2',
getName(){
console.log(this.name)
}
}
obj1.getName() // csdn1
obj2.getName() // csdn2
// 通过call,apply,bind改变this执行
obj1.getName.apply(obj2) // csdn2
obj1.getName.call(obj2) // csdn2
// 注意:obj1.getName.bind(obj2) // 即使改变了也不会执行,需要手动调用一下
obj1.getName.bind(obj2)() // csdn2
- apply接收两个参数,第一个参数是this的指向,第二个参数以数组形式传入
- call第一个参数是this的指向,后面可传多个参数
- bind第一个参数是this的指向,后面可传多个参数(无须一次性全部传入)
举例子:
var arr = [1,10,8,3,5]
console.log(Math.max.apply(null,arr)) // 10
var arr=[1,10,5,8,3];
console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10
var arr=[1,10,5,8,12];
var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])
console.log(max(arr[4])); //12,分两次传参
难点及重点:
bind是自调用函数后才能生效
apply和call传参方法不同
我问你答?
apply,call,bind有什么作用?
三者的区别是什么?
为什么要改变this指向?