Javascript 什么';“使用”的区别是什么;“出口”;vs.“;这";在Node.js模块中?

Javascript 什么';“使用”的区别是什么;“出口”;vs.“;这";在Node.js模块中?,javascript,node.js,Javascript,Node.js,很抱歉这个想法有点不成熟,但在开始使用Node.js时,我肯定在某个地方读到过这样的信息:由于模块是对象,this.myFunc与导出模块中的exports.myFunc一样适用于可公开访问的属性,如下所示: app.js var test = require('./modtest'); console.log(test.foo()); console.log(test.bar()); this.foo = function() { return "abc" } exports.bar = f

很抱歉这个想法有点不成熟,但在开始使用Node.js时,我肯定在某个地方读到过这样的信息:由于模块是对象,
this.myFunc
与导出模块中的
exports.myFunc
一样适用于可公开访问的属性,如下所示:

app.js

var test = require('./modtest');
console.log(test.foo());
console.log(test.bar());
this.foo = function() { return "abc" }
exports.bar = function() { return "xyz" }
modtest.js

var test = require('./modtest');
console.log(test.foo());
console.log(test.bar());
this.foo = function() { return "abc" }
exports.bar = function() { return "xyz" }

除了“正确的做法”,我为什么要使用
导出
对象?

导出对象解决范围问题,因此不必担心命名问题。对于您的函数,您只能对此进行一次foo调用,但对于导出,只要它们来自不同的导出,您基本上可以将其作为my foo函数,因为这些基本上是解析范围的文件。

与全局导出的
对象相等。这意味着,如果文件中某个位置的函数在不同的上下文中执行,
将停止引用
导出
对象,而是引用该新上下文。这发生在以下两个示例中:

// 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
可能会被代码中某个地方的局部变量覆盖,但更容易避免此类错误