今天在验证总结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中返回的是当前定时器的实例对象,差别明显。


Comments | NOTHING