我刚刚开始阅读有关Node.js的文章,有一件事我觉得很难理解,所以以为你们可能会帮忙! :)
特别是
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
它的解释是:
此代码创建一个只能通过代码访问的PI变量 包含在模块中;它不能在外面访问 模块。接下来,在exports对象上创建两个函数。这些 函数可以在模块外部访问,因为它们是 在exports对象上定义。因此,PI受到完全保护 来自外界的干扰。所以,你可以放心区域() 而圆周()总是表现得像它们应该的那样(只要一个 为r参数提供了值。
现在,我觉得很困惑的是他们在模块中的含义""和"在模块之外"。到目前为止我所理解的是模块本质上就是我们所说的封装,对吧?
考虑到这一点,当他们提到:
此代码创建一个只能通过代码访问的PI变量 包含在模块中;它不能在外面访问 模块。
..他们是否意味着PI扮演着所谓的全局变量的角色? 另外,如果PI是全局变量,那么为什么呢:
PI受到完全保护
来自外界的干扰。
谢谢!
答案 0 :(得分:0)
当您说module.exports
时,您可以将这些变量/函数用于在您的代码文件中执行require
的任何文件。 PI
无法受到外部干扰的原因是因为您未将PI
分配给module.exports
对象:
module.exports.PI = PI;
因此,如果您的代码位于名为geometry.js
的文件中并且您在同一目录中有另一个名为circle.js
的文件,那么更进一步。 circle.js
可以同时访问circumference
和area
要求geometry.js
中的circle.js
:
// circle.js
var geometry = require('geometry.js');
console.log(geometry.area(2));
console.log(geometry.circumference(2));
基本上,如果一个变量没有被添加到module.exports
对象,那么它就是文件的本地变量,如果它被添加到module.exports
对象,那么任何其他实现的代码都可以使用它。您的代码在require
语句中。
以下是模块的一个很好的解释以及Mixu's Node Book
中的示例摘自Mixu的节点手册第8章
模块对于在Node中构建应用程序至关重要,因为它们允许您包含外部库,例如数据库访问库 - 并且它们有助于将代码组织成具有有限责任的单独部分。您应该尝试在自己的代码中识别可重用的部分,并将它们转换为单独的模块,以减少每个文件的代码量,并使您更容易阅读和维护代码。
答案 1 :(得分:0)
我认为答案是在包含您发布的代码的开头段落中揭示的
var myModule = require('./myModule.js');
模块是封装的代码片段。模块中的代码大多是私有的 - 这意味着它们中定义的函数和变量只能从模块内部访问。但是,您可以公开要在模块外部使用的函数和/或变量。
您发布的代码为myModule
。 PI
将位于该模块内部,并且只能从模块内部访问。
在您第一次执行myModule.area()
之后,您可以从模块外部执行require
。但你不能myModule.PI
,因为它是该模块的本地,因此除非你向export
写一些内容,否则无法访问它。