为什么`exports`在nodejs模块中引用与this this相同的对象?

时间:2016-04-18 15:39:03

标签: javascript node.js

今天我发现使用导出的方式非常奇怪......这是单独的nodejs模块的代码,可以重现它。

大家将值分配给this范围,等于exports变量。他们如何实现exports = this

(function() {

  this.Test = (function(){

    function Test() {
      this.name = 'Test 1';
    }

    return Test;

  })();

  // Will output Test { name: 'Test 1' }
  console.log(new exports.Test);

  // Will output { Test: [Function: Test] }
  console.log(exports);

}).call(this);

1 个答案:

答案 0 :(得分:1)

在节点中,exports与DOM中的window对象非常相似,window.foo等同于this.foo,在全局范围内使用时。

在这种情况下,exports基本上是整个模块的this。当您使用.call(this)时,您实际上是手动将匿名函数的this值设置为模块的this值,AKA是全局范围对象。

因此,调用中的this引用全局范围,匿名函数绑定到全局thisexports等同于全局this

您的代码等同于:

this.Test = (function(){

  function Test() {
    this.name = 'Test 1';
  }

  return Test;
})();

// Will output Test { name: 'Test 1' }
console.log(new exports.Test);

// Will output { Test: [Function: Test] }
console.log(exports);