私人代码如何在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#世界,请将其视为类/公共/私有方法。 在节点模块中,除非导出,否则所有内容都是“私有”的。