Javascript嵌套函数性能

Kha*_*yen 13 javascript garbage-collection memory-leaks memory-management

我有一些嵌套函数,如

var freak = function() {
    var die = function() { ... }
    die(this);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,die每次freak调用时都会创建(分配)函数.

因此,如果freak被调用很多时间,这意味着将浪费大量内存(假设die没有使用来自freak上下文的任何内容;换句话说,即使它只被分配一次并在多次调用之间共享,它也能正常工作freak-这就是我浪费的意思).

我的理解是否正确?这是否意味着应该完全避免嵌套函数?

use*_*740 24

据我所知,die每次freak调用时都会创建(分配)函数.

是.这是真的.创建一个新的函数对象.

因此,如果freak被调用很多时间,那意味着很多内存将被浪费[...]

对于一些非常小且通常无关紧要的"浪费"的价值.

JavaScript引擎现在效率很高,可以执行各种技巧/优化.

例如,只有函数对象(但不是实际的函数代码!)需要在内部"复制".

[...]这是否意味着应该完全避免嵌套函数?

号有没有 "浪费"的问题没有实际的显示,否则测试案例.这个成语(嵌套和匿名函数)在JavaScript中很常见,并且非常优化.

嵌套函数提供许多好处,包括自我记录代码,较小的自包含词法范围以及其他代码隔离/组织优势.

  • +1值得注意的是,在OPs示例中,当freak()返回时,die函数将立即被垃圾收集,因为没有创建外部引用,因此一次只存在一个实例(在此类似情况下). (4认同)
  • “立即垃圾收集” - 我不这么认为;至少不是在每个浏览器中。我确实使用 V8.NET,V8 引擎仅在主机空闲时运行本机 GC 来收集对象。事实上,C#.NET 也不会费心去收集,直到内存变低(或者你强制它)。我相信,出于性能原因,V8 仅在内存变低时才会收集(基于某个阈值)。 (2认同)
  • @kofifus 可以应用相同的一般优化;此外,箭头函数可以避免额外的“this”绑定(它变成了潜在的捕获与调用工件)。除了最关键的代码/退化情况之外,函数是公平的公平游戏。(设备也不断变得更快。) (2认同)