Javascript 这个Node.js代码似乎取代了同一个函数中的函数实现,它是做什么的? 我试图调试一大堆NoDE.js代码,下面的代码看起来很疯狂(因为我的C++和C语言的经验)。有很多函数如下所示: function _builderUtil() { const data = require("builder-util"); _builderUtil = function () { return data; }; return data; }

Javascript 这个Node.js代码似乎取代了同一个函数中的函数实现,它是做什么的? 我试图调试一大堆NoDE.js代码,下面的代码看起来很疯狂(因为我的C++和C语言的经验)。有很多函数如下所示: function _builderUtil() { const data = require("builder-util"); _builderUtil = function () { return data; }; return data; },javascript,node.js,function,Javascript,Node.js,Function,。。。我不知道要搜索什么才能得到更多的细节 这是我在这里看到的。。。有一个名为\u builderUtil()的函数,其中有一个require()调用,该调用应加载指定的模块。然后还有第二个\u builderUtil函数中的内容。它看起来像一个包含匿名函数引用的变量。或者,这可能会取代外部函数实现 这个内部函数(看起来是匿名的)的目的是什么?这段代码是做什么的,在Node.js中是如何调用的,这样我就知道要搜索什么了 或者,这可能会取代外部函数实现 这就是它所做的。第一次调用\u builde

。。。我不知道要搜索什么才能得到更多的细节

这是我在这里看到的。。。有一个名为
\u builderUtil()
的函数,其中有一个
require()
调用,该调用应加载指定的模块。然后还有第二个
\u builderUtil
函数中的内容。它看起来像一个包含匿名函数引用的变量。或者,这可能会取代外部函数实现

这个内部函数(看起来是匿名的)的目的是什么?这段代码是做什么的,在Node.js中是如何调用的,这样我就知道要搜索什么了

或者,这可能会取代外部函数实现

这就是它所做的。第一次调用
\u builderUtil
时,它执行
require
调用,并将结果保存在本地
数据
常量中。然后,它用一个只返回
data
常量的函数覆盖执行该操作的函数。(由于内部函数关闭,
data
常量仍然存在。)

基本上,它通过
require
延迟加载数据,然后每次加载后调用它时都返回相同的数据

正如CertainPerformance在评论中指出的,这是不必要的。js的模块系统维护一个加载模块的缓存,因此在每次需要数据时只需使用
require(“builder util”)
就足够了,而不是调用
\u builderUtil

但是回到它的工作方式,忽略
的细节需要

最初,内存中有类似的内容:

+−−−−−−−−−−−−+ _builderUtil−−−−−>| (function) | +−−−−−−−−−−−−+ | [code] | +−−−−−−−−−−−−+ 然后,该函数用一个新函数覆盖
\u builderUtil
,该函数只返回
数据。函数有一个指向创建它们的环境对象的链接,因此一旦调用完成,您就有以下内容:

+−−−−−−−−−−−−+ | (function) | (the old function, ready to be garbage−collected) +−−−−−−−−−−−−+ | [code] | +−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | v | +−−−−−−−−−−−−−−+ | | (env object) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | data |−−−−−>| (some data) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−+ | _builderUtil−−−−−>| (function) | | +−−−−−−−−−−−−−−−+ | | [environment] |−−−−−−−−−−−−−−−−−−−−−−+ | [code] | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+ |(函数)|(旧函数,准备成为垃圾−(收集) +−−−−−−−−−−−−+ |[守则]| +−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | 五| +−−−−−−−−−−−−−−+ | |(环境物体)|| +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | |资料|−−−−−>| (部分数据)| +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−+ | _建筑工地−−−−−>| (功能)|| +−−−−−−−−−−−−−−−+ | |[环境]|−−−−−−−−−−−−−−−−−−−−−−+ |[守则]| +−−−−−−−−−−−−−−−+ 最终,垃圾收集发生了,您只需要

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | v | +−−−−−−−−−−−−−−+ | | (env object) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | data |−−−−−>| (some data) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−+ | _builderUtil−−−−−>| (function) | | +−−−−−−−−−−−−−−−+ | | [environment] |−−−−−−−−−−−−−−−−−−−−−−+ | [code] | +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | 五| +−−−−−−−−−−−−−−+ | |(环境物体)|| +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | |资料|−−−−−>| (部分数据)| +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−+ | _建筑工地−−−−−>| (功能)|| +−−−−−−−−−−−−−−−+ | |[环境]|−−−−−−−−−−−−−−−−−−−−−−+ |[守则]| +−−−−−−−−−−−−−−−+
尽管看起来很奇怪,为什么不直接使用
函数_builderUtil(){return require(“builder util”)}
?多次
require
调用不会再次运行其他模块的顶级代码,对吗?将其保存在变量中并重新分配函数有什么意义?(除非
builder util
在初始化后重新分配其导出,因此需要保存初始值,这真的很奇怪)@CertainPerformance-是的,我怀疑编写它的人不理解Node.js的模块缓存。:-)或者,他们希望创建一个抽象,这样您就不必在每次需要数据时都记住名称
“builder util”
(而不是
“builderutil”
“builder utils”
,等等)。(但即便如此,他们也可以让它每次调用
require
) +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | v | +−−−−−−−−−−−−−−+ | | (env object) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | data |−−−−−>| (some data) | | +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ | | +−−−−−−−−−−−−−−−+ | _builderUtil−−−−−>| (function) | | +−−−−−−−−−−−−−−−+ | | [environment] |−−−−−−−−−−−−−−−−−−−−−−+ | [code] | +−−−−−−−−−−−−−−−+