今天在验证总结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