在Node.js

时间:2016-01-23 20:32:17

标签: javascript node.js

在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>

文档没有说明这种非标准行为。

为什么会这样?

2 个答案:

答案 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的开发人员也这么认为。

这并不违反“标准”,因为标准对于没有窗口,导航,位置对象的环境一无所知。