如何在 nodejs 模块中访问私有代码?
How is private code accessed in nodejs modules?
加载模块后如何访问模块的私有函数和数据?
我知道 require
函数加载模块和 returns module.exports
对象,其中包含一些 public 对象或函数,但其他的 'private' 访问模块中的部分代码?它在内存中的什么位置?
TL;DR - NodeJS 模块中的代码可以继续访问它们在模块中定义的非导出内容,因为它们和它们定义的函数关闭 该数据。
详情:
NodeJS 模块是有效的大函数,当您 require
它们时,NodeJS 会 调用 。 (它们只被调用 一次,不管它们被调用了多少次 require
d。)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
同样的机制在两个地方都在起作用。
更多探索:
- How do JavaScript closures work?
- Closures are not complicated(在我的博客上)
模块的使用者只能与其 API、a.k.a 交互。它 输出什么 。您不能直接访问其私有函数和状态。那将违反封装。
模块本身可以为您完成。给定模块导出的任何函数都可以与该模块中的任何内容交互。
如果您来自 Java 或 C# 世界,请将其视为 class 上的 public/private 方法。在节点模块中,除非导出,否则一切都是 "private"。
加载模块后如何访问模块的私有函数和数据?
我知道 require
函数加载模块和 returns module.exports
对象,其中包含一些 public 对象或函数,但其他的 'private' 访问模块中的部分代码?它在内存中的什么位置?
TL;DR - NodeJS 模块中的代码可以继续访问它们在模块中定义的非导出内容,因为它们和它们定义的函数关闭 该数据。
详情:
NodeJS 模块是有效的大函数,当您 require
它们时,NodeJS 会 调用 。 (它们只被调用 一次,不管它们被调用了多少次 require
d。)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
同样的机制在两个地方都在起作用。
更多探索:
- How do JavaScript closures work?
- Closures are not complicated(在我的博客上)
模块的使用者只能与其 API、a.k.a 交互。它 输出什么 。您不能直接访问其私有函数和状态。那将违反封装。
模块本身可以为您完成。给定模块导出的任何函数都可以与该模块中的任何内容交互。
如果您来自 Java 或 C# 世界,请将其视为 class 上的 public/private 方法。在节点模块中,除非导出,否则一切都是 "private"。