在Node.js中,在传递给setTimeout()
的回调中,this
似乎绑定到timeoutObject
本身返回的setTimeout()
(在严格模式下和非严格模式!):
var timeoutObject = setTimeout(function () {
console.log(this === timeoutObject); // true
}, 0);
var timeoutObject = setTimeout(function () {
'use strict';
console.log(this === timeoutObject); // true
}, 0);
在浏览器中不是这种情况,this
绑定(如我所料)全局对象window
(或undefined
,在严格模式下)。< / p>
文档没有说明这种非标准行为。
为什么会这样?
答案 0 :(得分:1)
以下是一次讨论this` binding incorrect for `setTimeouf(..)` and `setInterval(..)
。这解释了这个问题,甚至有人尝试修复它,但未被接受。
以下是一些想法
setTimeout
将计时器对象绑定到&#34;这个&#34;回调中的对象。 首先,在大多数情况下,Node中的执行环境是一个&#34;模块&#34;,所以当var k=2; exports.k=3; console.log(k);//2 console.log(this.k);//3
这是浏览器和节点之间的区别。参考&#34;窗口&#34;浏览器中的对象很容易因为它是一个全局对象。但是在Node中,setTimeout / setInterval无法获得&#34; exports&#34;对象也不是模块的执行环境。
无论如何,当前的方式集*()都有优势(但是,授予它没有文档但是它在野外使用)。例如:
setInterval(function() { if (/* <condition> */) this.unref(); // do more stuff }, /* <n> */);
答案 1 :(得分:1)
Nodejs不是浏览器。你所谈论的“标准”是针对浏览器的。阅读文档:
https://html.spec.whatwg.org/multipage/webappapis.html#dom-windowtimers-settimeout
要实现这两个计时功能,“this”应绑定到窗口对象(在Nodejs中不可用)或工作对象(在nodejs中不可用)。
Nodejs拥有自己的全局对象,在这种情况下可能是一个很好的目标,但我认为将此绑定到此函数更好,而不是某些全局对象。似乎Nodejs的开发人员也这么认为。
这并不违反“标准”,因为标准对于没有窗口,导航,位置对象的环境一无所知。