Javascript 如何正确地要求一个节点模块,导出其中的所有函数

Javascript 如何正确地要求一个节点模块,导出其中的所有函数,javascript,node.js,Javascript,Node.js,我有一个文件stats.js 它的内容是 (function () { func1 = function () { } func2 = function () { } module.exports = this; }).call(this); 永远地,当我这样做的时候 var stats = require("./stats"); 我应该可以用stats.func1,stats.func2得到func1和func2,对吗 嗯,我不能。stats

我有一个文件stats.js

它的内容是

(function () {
    func1 = function () {

    }
    func2 = function () {

    }

    module.exports = this;

}).call(this);
永远地,当我这样做的时候

var stats = require("./stats");
我应该可以用stats.func1,stats.func2得到func1和func2,对吗

嗯,我不能。stats对象只是空的。js中的一些痕迹显示“this”也是一个空对象


有什么好处?

不,不应该?这种格式与Node.js完成其工作所需的格式完全不同

“给你的”是你没有读过节点是如何工作的。Node.js不仅仅是“JavaScript”,它是一个编程模型,具有更丰富的API和特定的行为。需要使用“module.exports”对象,因此最好实际了解如何使用节点

mything.js:

var func3 = function() { ... },
    prop = "something";
...
module.exports = {
  func1: function() { ... },
  func2: function() { ... },
  func3: funct3,
  prop: prop,
  ...
};
这与:

var func3 = function() { ... },
    prop = "something",
    ...
    MyLib = {
      func1: function() { ... },
      func2: function() { ... },
      func3: funct3,
      prop: prop,
      ...
    };
...
module.exports = MyLib;
app.js:

var mything = require("mything);
首先,请参阅链接

现在让我们看看你的代码-

    var stats = require("./stats");
    //My steps - 

    //First Log
    console.log(stats.func1); // returns undefined
    //Second Log
    console.log(global.func1, global === GLOBAL); // returns [Function], true
此代码的附加信息-
1.在浏览器中,全局对象是
窗口
对象。
2.在node.js中,它是
全局对象。
3.在模块中使用
var
定义某个变量只会创建一个范围为
模块
的变量。
4.不使用
var
关键字定义将在全局范围内创建一个变量

因此,在全局范围内定义了
func1
func2
。将此传递到
模块。导出将仅传递当前模块对象


希望有帮助,快乐编码

您是否有意将函数分配给全局对象,然后尝试导出全局对象?我不想这样。我希望通过要求文件然后执行stats.func来访问该函数。好吧,我自己没有想到这一点,你可以肯定这一点。我在什么地方读过。下划线的作用非常类似,但代码有点让我难以理解。它绝对不起作用的是你在这里写的。也许是名字把你弄糊涂了。“Node.js”不是javascript库。它是服务器端引擎的名称,允许您使用JavaScript语法编写脚本,使用基于回调的事件系统,具有完整的标准库,包括包导入,所有这些都被正式化为节点API。。。它实际上与您在
的客户端库中找到的内容无关,但我在node.js项目中使用了下划线。我可以看到下划线的来源,它看起来就像我所描述的。我在我的代码中需要它,就像我描述的那样,而且它是有效的。区别在于它不像module.exports=this那么简单,但它非常接近。它肯定不像您那样单独命名每个函数,因为我给您提供了所显示代码的结构。如果您已经有一个大型库,那么使用
var MyLib=大量代码要容易得多;module.exports=MyLib,它是完全相同类型的代码,只是对象定义与导出分离。让我来编辑我的帖子,向你展示它的等价性。下划线之所以起作用,是因为它查找节点中是否正在使用它,然后隐藏模块。exports函数使其看起来像下划线通常使用的一样,请参见。看起来下划线执行了u.someFunction而不是someFunction,然后导出了u对象。谢谢你的耐心。问题是,这在不久前还有效,但后来我改变了一些东西,它停止了工作。