- 函数完整的调用方法是使用call方法,包括fn.call(context, name)和obj.fn.call(context,name),这里的context就是函数调用时的上下文,也就是this,只不过这个this是可以通过call方法来修改的
- 构造函数稍微特殊一点,它的this直接指向new之后返回的对象
- window.setTimeout()和window.setInterval()默认的是this是window对象。
- 箭头函数:默认绑定外层this&不能用call方法修改里面的this
1.不使用箭头函数:
const obj = {
a: function() { console.log(this) }
}
obj.a() //打出的是obj对象
2.使用箭头函数的例子:
const obj = {
a: () => {
console.log(this)
}
}
obj.a() //打出来的是window
在使用箭头函数中,因为箭头函数默认不会使用自己的this,而是会和外层的this保持一致,最外层的this就是window对象。
const obj = {
a: function() {
console.log(this)
window.setTimeout(() => {
console.log(this)
}, 1000)
}
}
obj.a.call(obj) //第一个this是obj对象,第二个this还是obj对象
window.setTimeout()中函数里的this默认是window,以上例子可以通过箭头函数使它的this和外层的this保持一致.
函数obj.a没有使用箭头函数,因此它的this还是obj,而setTimeout里的函数使用了箭头函数,所以它会和外层的this保持一致,也是obj;
如果setTimeout里的函数没有使用箭头函数,那么它打出来的应该是window对象。