箭头函数没有this,它的this取决于作用域链上的this,它不可以通过 bind 等方法改变this 指向。
const obj = {
a: () => {
console.log(this)
}
}
obj.a() // 1 .window
const obj = {
a: function() { console.log(this) },
b: {
c: () => {console.log(this)}
}
}
obj.a() // 2. obj
obj.b.c() // 3 .这里是 window
3. 中打印出 window 是因为 b是obj的一个属性,它们应该是同一级的作用域。
换种话说, 箭头函数 this 的指向是指向上一层普通函数的 this,
var obj = {
a : function () {
setTimeout(function () {
console.log(this);
},0);
},
b : function () {
console.log(this);
}
};
obj.a(); // Window
obj.b(); // object Object
《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined。