首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时在Node.js V8中分配和编译闭包?

何时在Node.js V8中分配和编译闭包?
EN

Stack Overflow用户
提问于 2016-04-10 12:22:59
回答 2查看 665关注 0票数 1

根据我目前对VM及其行为的假设,我认为每次命中闭包定义时都会分配和编译闭包;与在闭包外声明的函数相反,闭包只被分配和编译一次(因为它们放置在某个地方,所以定义只命中一次)。这个假设正确吗?

因此,如果我在socket.on('data', function (data) {...})中有一个闭包,那么每当套接字接收到数据时,V8都会分配新的内存(可能还会重新编译)闭包?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-10 12:59:24

我认为每次命中闭包定义时都会分配和编译闭包。

不怎么有意思。闭包只编译一次,但每次命中定义时都会分配。最重要的是,您必须区分分配和编译。

  • 每个函数的代码(即源代码中相同的位置)只编译一次,即使函数在不同的环境中被实例化了多次。 在每一个实例化上编译都是没有意义的,就像为每个调用编译一样(不过,“解释器”就是这样做的,边界是不稳定的,例如,对于不是在第一次调用之前发生的延迟编译)。 如果代码成为优化的候选程序,或者如果优化失败,并且必须进行去优化,那么可能会再次编译(使用更慢但更复杂的编译器),但这不是重点所在。
  • 每个函数在其定义命中时被分配/实例化,这与本地函数(嵌套在其他函数中)特别相关。 然而,非闭包函数的分配成本为零,因为不需要存储环境指针,不需要实例对象。

因此,如果我在socket.on('data', function (data) {...})中有一个闭包,那么每当套接字接收到数据时,V8都会分配新的内存(可能还会重新编译)闭包?

不是function (data) {…},它只实例化一次并传递给on调用。

但是,如果您有一个在部件中实例化的闭包,那么每次接收数据和调用处理程序时,都会分配一些内存。但是没有必要担心这个问题,内存分配成本低,速度快。

如果您正在寻找技术细节,我建议您阅读http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html (尽管它已经有几年的历史了)。

票数 7
EN

Stack Overflow用户

发布于 2016-04-10 12:41:59

根据我目前对VM及其行为的假设,我认为每次命中它们的定义时,都会分配和编译闭包;

正确的

与在外部声明的函数相反,闭包只分配和编译一次。

假的,这些也是编译每次他们的定义被击中,但他们通常放在一个地方,他们的定义只命中一次。

闭包设计为多次定义,每次包含不同的变量/值。

这就是我们如何区分这是一个简单的/匿名的函数还是闭包

每次套接字接收到数据时,V8都会分配新内存。

不,这个匿名函数编译一次,然后传递给事件处理程序。事件处理程序现在有一个对此函数的引用,并在每次接收数据时调用它。

当添加事件侦听器时,此示例中的定义也只命中一次。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36529656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档