在Node.js模块中使用“exports”与“this”之间的区别是什么?

时间:2012-03-16 16:25:41

标签: javascript node.js

对于略微半成型的想法表示抱歉,但是在开始使用Node.js时,我确信我在某处读到,因为模块是对象,this.myFunc对于可公开访问的属性同样适用exports.myFunc在一个模块中,像这样:

app.js

var test = require('./modtest');
console.log(test.foo());
console.log(test.bar());

modtest.js

this.foo = function() { return "abc" }
exports.bar = function() { return "xyz" }

除了“做正确的事”之外,我为什么要使用exports对象?

2 个答案:

答案 0 :(得分:1)

this等于全局exports对象。这意味着如果文件中的某个函数使用不同的上下文执行,this将停止引用exports对象,而是引用该新上下文。这发生在以下两个例子中:

// here, this == exports

function foo() {
  console.log(this);
  console.log(exports);
}

foo();          // prints out the same object twice
obj = { foo: foo };
obj.foo();      // prints out 'obj', then the 'exports' object
foo.call(obj);  // prints out 'obj' then 'exports' again

这样,使用exports会更“安全”,除非您确定this永远不会被其他上下文覆盖。

同样地,exports可以被代码中的某个局部变量覆盖,但是更容易避免这种类型的错误。

答案 1 :(得分:0)

exports对象解析范围,因此不必担心命名问题。使用你的函数你只能有一个foo调用,但是对于导出本质上你可以拥有我的foo函数,只要它们来自不同的导出,因为它们本质上是解析范围的文件。