【问题标题】:Javascript nested function performanceJavascript嵌套函数性能
【发布时间】:2013-11-15 18:45:43
【问题描述】:

我有一些嵌套函数,例如

var freak = function() {
    var die = function() { ... }
    die(this);
}

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

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

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

【问题讨论】:

  • 这并不广泛。非常具体实用……

标签: javascript memory-management memory-leaks garbage-collection


【解决方案1】:

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

是的。这是真实的。创建了一个新的函数对象。

所以如果freak 被调用很多时间,这意味着大量内存将被浪费 [...]

对于一些非常小且通常无关紧要的“浪费”值。

如今,JavaScript 引擎非常高效,可以执行各种技巧/优化。

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

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

没有。 没有 “浪费”问题没有实际测试用例,否则显示。这个(嵌套和匿名函数的)习语在 JavaScript 中非常常见,并且针对它进行了很好的优化。

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

【讨论】:

  • +1 还值得注意的是,在 OPs 示例中,由于没有创建外部引用,所以当freak() 返回时,die 函数将立即被垃圾收集,因此一次只会存在一个实例(在这种情况和类似情况下)。
  • “立即收集垃圾” - 我不这么认为;至少不是在每个浏览器中。我确实使用 V8.NET,并且 V8 引擎仅在主机空闲时运行本机 GC 来收集对象。事实上,C#.NET 也不会费心去收集,直到内存变低(或者你强迫它)。我相信 V8 出于性能原因,也只会在内存变低时收集(基于某个阈值)。
  • 以箭头表示法定义的函数(即 const f = () => { ... } )呢?在这种情况下开销是否“非常小且通常无关紧要”?跨度>
  • @kofifus 可以应用相同的一般优化;此外,箭头函数可以避免额外的this 绑定(它变成了潜在的捕获与调用工件)。在最关键的代码/退化情况之外,函数是公平公平的游戏。 (设备也不断变得更快。)
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2021-09-09
  • 2019-05-23
相关资源
最近更新 更多