Javascript 如何正确地要求一个节点模块,导出其中的所有函数
我有一个文件stats.js 它的内容是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
(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对象。谢谢你的耐心。问题是,这在不久前还有效,但后来我改变了一些东西,它停止了工作。