闭包需要多少内存?

How much memory does a closure take?

提问人:Alexander Abakumov 提问时间:9/20/2015 最后编辑:Alexander Abakumov 更新时间:1/22/2016 访问量:357

问:

我想知道 JavaScript 闭包的内存占用是多少?
这个金额取决于什么?

闭包消耗内存的第一个明显因素是它捕获的变量数量及其大小。
好的,让我们假设我们有一个简单的闭包:

var counter = (function () {
    var num = 0;

    return function () {
        return ++num;
     }
}());

需要多少内存?
如果很难说出确切的数字,我至少想知道这些数字的规模。是 10、100 字节还是更多?
JavaScript 实现之间是否存在显著差异?

我希望这些问题的答案,尤其是一些数字的答案,能帮助我和其他读者澄清:
尽可能多地使用闭包是一种好的做法吗?
或者您应该谨慎使用它并尽可能避免使用它,因为使用封盖的开销可能会超过它带来的好处。

换句话说,我希望我能够更好地理解哪些情况值得使用闭包,哪些不值得。

编辑 1
为了解决@MaximillianLaumeister关于问题过于宽泛的评论,让我们稍微改写一下:
这样的闭包由内存中的哪些部分组成?它们彼此之间有多大,也许是绝对数量?它们在 JavaScript 引擎中是否相同?
从下面的评论中,这些部分应该是:

  1. 与捕获的变量具有相同属性数的对象 (@Dan)
  2. 到目前为止,闭包的最大部分是其(编译)代码 (@Bergi)
JavaScript 性能 内存 闭包

评论

1赞 Maximillian Laumeister 9/20/2015
在我看来,这个问题对于 Stack Overflow 来说有点太宽泛了,但为了给你一些超级模糊的答案,它们占用了“不太多”的内存,它们可能会在实现之间有所不同,但不会很大,除非你在循环中创建闭包,否则我根本不会担心开销。
0赞 Dan D. 9/20/2015
作用域的大小与具有相同属性数的对象大致相同。闭包是另一个具有固定数量属性的对象。请参阅 es5.github.io/#x10.2es5.github.io/#x13.2
1赞 Bergi 9/20/2015
"闭包消耗内存的第一个明显因素“——到目前为止,闭包的最大部分是其(编译)代码。幸运的是,这是通过从同一函数表达式创建的所有实例共享的。
0赞 v010dya 9/20/2015
“哪些情况值得使用闭合,哪些不值得” 反对什么替代方案?为每种潜在用途创建单独的功能?在这种情况下,请始终创建闭合!
0赞 Alexander Abakumov 9/20/2015
@Bergi,闭包包含哪些编译代码?我认为闭包在内部表示为一种数据对象,其属性是捕获的变量。为什么它需要编译代码,更令我惊讶的是,为什么这部分是闭包的最大部分?

答: 暂无答案