v8 对嵌套函数的优化效果如何?

问题描述 投票:0回答:2

有时我会看到这样的代码:

var doSomething = function(object){
    var results = []
    var doSomethingElse = function(object){
        ...
    }
    results.push(doSomethingElse(...))
    return results
}

这样组织是因为

doSomethingElse
仅在
doSomething
内有意义。性能是可以接受的,所以这只是一个好奇:v8 对嵌套函数的优化效果如何? 每次调用 doSomething() 时都会实例化 doSomethingElse() 的新副本吗?

javascript node.js optimization v8
2个回答
1
投票

我不知道它的优化程度如何,我不认为你会得到这样的信息,这种问题太宽泛了,我知道,因为我以前问过这些问题,答案总是“尝试”它,配置文件并查看”。

话又说回来,我不会回答这么说。

我发现有 2 个来源建议不要使用它们,因为它们为引擎添加了另一个步骤,因为它需要每次创建函数,并向作用域链添加一个级别。

具体原因和测试在这里:

http://code.tutsplus.com/tutorials/stop-nesting-functions-but-not-all-of-them--net-22315

https://developers.google.com/speed/articles/optimizing-javascript

这可能应该在评论中,但我还不能发表评论。


0
投票

我不了解 V8 的内部结构,但我认为闭包应该得到了很好的优化。但要回答问题的其他部分:是的,每个

doSomethingElse
调用都会创建一个新的
doSomething
。这是从语言的角度来说的。从技术上讲,智能 JIT 可能已经对此进行了优化。

如果您担心这一点,您可以通过在自调用函数中定义

doSomethingElse
来保证它被创建一次:

var doSomething = (function() {
  var doSomethingElse = function(object){ // only defined once
      ...
  };

  return function(object){ // the actual doSomething function
      var results = [];
      results.push(doSomethingElse(...));
      return results;
  };
}());

您只需要记住,这将在所有

doSomethingElse
调用中持续存在
doSomething
。因此,如果您执行任何有状态的操作,您可能会看到一些意想不到的行为。

© www.soinside.com 2019 - 2024. All rights reserved.