setTimeout setInterval 回调函数中的 this 指向问题

57 阅读1分钟
setTimeout(function () {
    console.log(this) // window
}, 1)

为什么此处的 this 指向 window?先要了解到传统函数是如何定义 this 的

传统函数的 this 指向

根据函数调用的情况决定 this 指向,主要有 3 种情况:

1. 如果该函数是一个构造函数,this 指向这个类的实例;

2. 严格模式下的函数调用,this 指向 undefined;

3. 如果该函数是一个对象的方法,this 指向这个对象。

再看 setTimeout 内部的实现(简化)

function setTimeout(callback, delay) {
    // 省略
    callback()
    // 省略
}

回调函数并没有在任何对象之下被调用(表面来看),是不是和全局函数的调用类似?那全局函数在非严格模式下是注册在 Window 对象之中的,所以就可以解释,为什么 setTimeout、setInterval 的回调函数 中的 this,指向是 Window 了