bind改变this指向
bind可以改变this的指向。bind()方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。也就是说 bind() 会返回一个新函数。不太好理解,上代码就知道了。
let name = 123
function fn() {
console.log(this)
}
fn()
let obj = {
name:456
}
let fn2 = fn.bind(obj)
fn2()
这里如果调用fn,this指向的是window,而通过bind调用,传入的参数就是this的指向,而返回的新函数,功能和fn是一模一样的,执行的代码依旧是原函数内部代码,只不过修改了this指向。 所以调用以后,fn2的this指向的就是obj
注意:
箭头函数中的this不会被改变,即使用bind去绑定也不会变。 bind只是返回了一个函数,本身是不会执行函数的,需要再次自己手动去调用。
call和apply改变this指向
call()方法与 apply()方法的作用相同,它们的唯一区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。 call和apply会直接调用函数,并且修改this指向为传入的第一个参数
let obj1 = {
name:'zhangsan',
clg(){
console.log(this.name)
}
}
let obj2 = {
name:'lisi'
}
obj1.clg()
obj1.clg.call(obj2)
注意: call和apply的区别 call传的第二个,第三个参数是原来函数的形参,而apply第二个参数是原来形参组成的数组。
- 参数数量,顺序确定就用call,参数数量,顺序不确定就用apply
- 参数数量少用call,参数数量多用apply
- 参数集合已经是一个数组的情况,最好用apply