声明:call、apply、bind无法改变箭头函数的this指向
例如:
const fun1 = ()=>{
console.log(this === window)
}
const person = {
name:'tom'
}
fun1() // true
fun1.apply(person) // true
fun1.bind(person) // true
fun1.call(person) // true
可以看到箭头函数在这里初始的时候指向window
,使用apply、bind、call来尝试改变它的指向,都失败了,始终指向window
结论:箭头函数指向为它的爷爷对象。也就是父级的父级对象。
证明:
const obj = {
name:'obj',
fun1:function (){
return setTimeout(()=>{
console.log(this.name)
},1000)
}
}
const person = {
name:'person',
age:'22'
}
obj.fun1() // obj
obj.fun1.apply(person) //person
可以看到,我们在setTimeout
中调用箭头函数,setTimeout
为全局函数,它指向的是window
,然后我们是在obj
对象里面的调用setTimeout
,箭头函数的this
指向父级的父级,在这里也就是指向了obj
前面说到,我们不能改变箭头函数的指向,但是我们可以改变它父级的父级的指向,由于箭头函数指向父级的父级,也就代表着我们改变了箭头函数的指向。例子里面我们改变了fun1
的指向,成功改变了箭头函数的指向。