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] |
+−−−−−−−−−−−−−−−+