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