什么时候在Node.js V8中分配和编译closures?

根据我目前关于虚拟机及其行为的假设,我每次打出定义时都会分配和编译闭包。 与在封闭之外声明的函数相比,它们被分配和编译一次(因为它们被放置在某个地方,它们的定义只被命中一次)。 这个假设是否正确?

所以,如果我在socket.on('data', function (data) {...})有一个闭包,V8会在每次 socket收到数据时分配新的内存(并可能重新编译)闭包。

每当他们的定义被打时,我都会分配和编译封闭的数据

不是真的。 闭包只编译一次 ,但每次定义时都会被分配。 最重要的是,你必须区分分配和汇编。

  • 即使函数在不同环境中被多次实例化,每个函数的代码(即源代码中的相同位置)也只编译一次。
    在每一个实例上编译都是毫无意义的,就像每一次调用都没有意义的编译一样(尽pipe这实际上是一个“解释器”所做的事情,而且边界是stream动的,例如对于懒惰的编译而言,第一个电话)。
    如果代码成为优化候选,或者如果优化失败并且必须被去优化,则代码可以被再次编译(具有较慢但更复杂的编译器) 但除此之外,

  • 每个函数在被定义时被分配/实例化,这对于本地函数(嵌套在其他函数中)是特别相关的。
    然而,非closures函数的分配成本为零,因为不需要存储环境指针,所以不需要实例对象。

所以,如果我在socket.on('data', function (data) {...})有一个闭包,V8会在每次socket收到数据时分配新的内存(并可能重新编译)闭包。

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

但是,是的,如果你有一个在部分中实例化的闭包,那么每当接收到数据并且调用处理程序时,它将分配一些内存。 但是没有必要担心,内存分配便宜而且快速。

如果你正在寻找技术细节,我build议阅读http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html (即使它已经几年了)。

根据我目前关于虚拟机及其行为的假设,我每次打出定义时都会分配和编译闭包。

与在分配和编译一次的closures之外声明的函数相反。

假的,这些也是每次定义被打的时候编译的,但是它们通常放在一个地方,它们的定义只被击中一次。
closuresdevise被定义多次并且包含每次不同的variables/值。
这就是我们如何区分这是一个简单/匿名函数或闭包

每当数据被套接字接收时,V8就分配新的内存

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

在添加事件侦听器的时候,这个例子中的定义也只打了一次。