在非严格模式下,匿名函数和定时器中的 this 由于没有默认的宿主对象,因此指向 window;
而在严格模式下,匿名函数和定时器中的 this 由于没有默认的宿主对象,因此为 undefined。
而 ES6 的箭头函数,他的 this 是继承而来的,默认是定义他的时候的宿主对象。
1、定时器的 this
// (1)、ES5 写法
var obj = {
fun: function() {
var _this = this;
setTimeout(function(){
console.log(_this);
},100);
}
}
obj.fun(); // obj
// (2)、ES6 写法
let object = {
fun: function() {
setTimeout(()=>{
console.log(this);
},100);
}
}
object.fun(); // obj
// (3)、ES6 错误写法
let object1 = {
fun: ()=> {
setTimeout(()=>{
console.log(this);
},100);
}
}
object1.fun(); // window
2、匿名函数的 this
// window var obj = { say: function () { var f1 = function () { console.log(this); // window, f1调用时,没有宿主对象,默认是window } f1(); } } obj.say(); // obj var obj = { say: function () { var f1 = ()=> { console.log(this); // obj } f1(); } } obj.say();
? 思考:
Array.prototype.whoIsThis = () => { console.log(this); // window } Array.prototype.whoIsThis = function () { console.log(this) // Array }