setTimeout 和 setInterval 中 this 指向问题


今天在验证总结JavaScript的this指向的情况,当总结到setTimeout和setInterval的this时有了新的发现。

废话不多数,先旗帜鲜明地给出结论:

1、setTimeout和setInterval定时器的第一个参数执行函数的this指向,在浏览器中永远指向window对象,在node.js环境中永远指向当前定时器的实例对象;
2、在浏览器中,调用setTimeout 和 setInterval 返回了一个定时器id数字,而在node.js中返回的是当前定时器的实例对象,差别明显。

接下来验证:

在浏览器中运行如下代码:

let obj = {
    foo: function () {
        let timer = setTimeout(
            function () {
                console.log(this);
                console.log(typeof timer, timer);
            }, 200);
    }
}

obj.foo();

运行结果:

没问题,this指向window对象;

再看在node.js中,执行如下代码:

let obj = {
    foo: function () {
        let timer = setTimeout(
            function () {
                console.log(this === timer);
                console.log(typeof timer);
                console.log(this);
            }, 200);
    }
}
obj.foo();

可以看到this,指向当前定时器实例timer。

减少一下干扰代码,去掉外层的对象,如下:

let timer = setTimeout(
    function () {
		console.log(this === timer);
		console.log(typeof timer);
		console.log(this);
    }, 200);

结果完全相同。

而且还得到另一个结论:

在浏览器中,调用setTimeout 和 setInterval 返回了一个定时器id数字,而在node.js中返回的是当前定时器的实例对象,差别明显。




一片冰心在玉壶