私人代码如何在nodejs模块中访问?
加载模块后私有函数和模块数据是如何访问的?
我知道require
函数加载模块并返回包含一些公共对象或函数的module.exports
对象,但模块中代码的其他“ 私有 ”部分如何被访问? 它在哪里位于内存?
TL; DR – NodeJS模块中的代码可以继续访问它们在模块中定义的非导出事物,因为它们及其定义的函数closures了这些数据。
细节:
NodeJS模块实际上是在您require
时由NodeJS 调用的大型函数。 (它们只被调用一次 ,无论它require
多less次d)。JavaScript中的函数调用会设置一个执行上下文,并且在该上下文中创build的任何函数都会closures上下文(它们有一个持久的引用,并且其内容)。 只要有任何引用,执行上下文在内存中仍然存在,即使在“函数”已经返回之后。 在执行上下文中创build的函数是“ 闭包 ”。
所以说你有一个模块foo
:
var privateData = Math.random(); function publicFunction() { console.log("The private data is " + privateData); } module.exports.publicFunction = publicFunction;
你require
它:
var foo = require("foo"); foo.publicFunction(); // Displays the random number
这类似于返回一个对象的函数:
function fooModule() { var privateData = Math.random(); function publicFunction() { console.log("The private data is " + privateData); } return { publicFunction: publicFunction }; }
你打电话给:
var foo = fooModule(); foo.publicFunction(); // Displays the random number
两个地方都有同样的机制。
更多探索:
- JavaScriptclosures如何工作?
- closures并不复杂 (在我的博客上)
一个模块的用户只能与其API进行交互,也就是它所输出的内容 。 你不能直接访问它的私有函数和状态。 这将违反封装。
模块本身可以为你做。 无论由给定模块输出的函数都可以与该模块中的任何内容交互。
如果您来自Java或C#世界,请将其视为类/公共/私有方法。 在节点模块中,除非导出,否则所有内容都是“私有”的。