根据我目前对VM及其行为的假设,我认为每次命中闭包定义时都会分配和编译闭包;与在闭包外声明的函数相反,闭包只被分配和编译一次(因为它们放置在某个地方,所以定义只命中一次)。这个假设正确吗?
因此,如果我在socket.on('data', function (data) {...})中有一个闭包,那么每当套接字接收到数据时,V8都会分配新的内存(可能还会重新编译)闭包?
发布于 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 (尽管它已经有几年的历史了)。
发布于 2016-04-10 12:41:59
根据我目前对VM及其行为的假设,我认为每次命中它们的定义时,都会分配和编译闭包;
正确的
与在外部声明的函数相反,闭包只分配和编译一次。
假的,这些也是编译每次他们的定义被击中,但他们通常放在一个地方,他们的定义只命中一次。
闭包设计为多次定义,每次包含不同的变量/值。
这就是我们如何区分这是一个简单的/匿名的函数还是闭包
每次套接字接收到数据时,V8都会分配新内存。
不,这个匿名函数编译一次,然后传递给事件处理程序。事件处理程序现在有一个对此函数的引用,并在每次接收数据时调用它。
当添加事件侦听器时,此示例中的定义也只命中一次。
https://stackoverflow.com/questions/36529656
复制相似问题