如何在 nodejs 模块中访问私有代码?

How is private code accessed in nodejs modules?

加载模块后如何访问模块的私有函数和数据?

我知道 require 函数加载模块和 returns module.exports 对象,其中包含一些 public 对象或函数,但其​​他的 'private' 访问模块中的部分代码?它在内存中的什么位置?

TL;DR - NodeJS 模块中的代码可以继续访问它们在模块中定义的非导出内容,因为它们和它们定义的函数关闭 该数据。

详情:

NodeJS 模块是有效的大函数,当您 require 它们时,NodeJS 会 调用 。 (它们只被调用 一次,不管它们被调用了多少次 required。)JavaScript 中的函数调用设置了一个 执行上下文和在上下文中创建的任何函数关闭上下文(它们对上下文及其内容有持久引用).只要有任何引用,执行上下文就会在内存中存在,即使在 "function" 返回之后也是如此。在执行上下文中创建的函数是“closures”。

假设你有一个模块 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

这类似于具有 returns 一个对象的函数:

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

同样的机制在两个地方都在起作用。

更多探索:

模块的使用者只能与其 API、a.k.a 交互。它 输出什么 。您不能直接访问其私有函数和状态。那将违反封装。

模块本身可以为您完成。给定模块导出的任何函数都可以与该模块中的任何内容交互。

如果您来自 Java 或 C# 世界,请将其视为 class 上的 public/private 方法。在节点模块中,除非导出,否则一切都是 "private"。