在 Node.js 中,如果我加载一个包含模块范围内代码的模块,例如:
this["foo"] = function() { console.log("foo"); }
...然后我似乎得到了一个全局可用的函数,我可以通过foo()
使用该模块的任何代码来调用它。它可以看作是带有 的印刷品之一Object.getOwnPropertyNames(this)
。
但是,如果我将以下内容放在模块范围内:
function foo() { console.log("foo"); }
...然后它会生成一个函数,该函数可以在该模块中以类似方式调用foo()
,但在其外部是不可见的(例如,不显示为带有 的项目之一Object.getOwnPropertyNames(this)
)。
我认为这是在浏览器中所做的运行时行为的变化。默认情况下,浏览器似乎将所有内容都放入全局范围(多年来,人们不得不通过将事物包装在匿名函数/等中来有意识地避免这种情况)
我的问题是 NodeJs 是否有一些秘密的方式来与模块之外的这些声明进行交互,在这些声明中它们被声明为BESIDES usingexports.(...) = (...)
. 是否可以以某种方式枚举它们,或者如果它们没有被模块导出调用,它们是否会在声明它们时立即被垃圾收集?如果我在加载模块之前知道这样一个函数的名称......我可以告诉 Node.js 在定义它时“捕获它”吗?
我不希望有任何此类功能得到充分记录……但也许有调试器功能或其他系统调用。最好的指针之一是指向处理这种声明的 Node.js 项目中的特定代码,以查看是否存在任何漏洞。
注意:在对 V8 进行一些研究时,我发现“函数定义”没有被添加到上下文中。它被放入“执行上下文”的“激活对象”中,不能以编程方式访问。如果您想要一些“轻松阅读”,我发现: