和函数中的this是运行时动态绑定的不同,箭头函数实际上没有自己的this,箭头函数中的this是静态的绑定到了外层作用域(全局作用域或函数作用域)的this:
let time = "morning";
let greeting = {
time : "evening",
say : () =>{
console.log("Good " + this.time);//对象不存在作用域,因此箭头函数的外层作用域是全局作用域
}
}
greeting.say();//输出Good morning
静态绑定后,即使运行对象环境变化了,this依旧指向了箭头函数定义时的对象:
let greeting = {
time : "evening",
say : function() {
let f = ()=>{//箭头函数定义在函数内,箭头函数的this引用到了外层作用域(函数say的作用域)的this,函数say的this指向了对象环境greeting,因此箭头函数的this被静态的绑定到了对象greeting
console.log("Good " + this.time);//this.time静态的指向了greeting.time
}
return f;
}
}
greeting.say()();//通过greeting 对象调用,输出Good evening
let doGreet = greeting.say();//将箭头函数赋值给变量doGreet
doGreet();//在window对象环境下运行doGreet,由于是静态绑定,所以输出还是Good evening
let time = {
time : "morning",
doGreet : greeting.say()//将函数作为另一个对象的属性
};
time.doGreet();//由于this被静态绑定到了greeting对象,即使通过对象time调用,输出还是Good evening