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

Javascript v8优化嵌套函数的效果如何?,javascript,node.js,optimization,v8,Javascript,Node.js,Optimization,V8,有时我会看到这样的代码: var doSomething = function(object){ var results = [] var doSomethingElse = function(object){ ... } results.push(doSomethingElse(...)) return results } 之所以这样组织,是因为doSomethingElse仅在doSomething中具有含义。性能是可以接受的,所以这

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

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

之所以这样组织,是因为
doSomethingElse
仅在
doSomething
中具有含义。性能是可以接受的,所以这只是一个好奇:v8对嵌套函数的优化程度如何是每次调用doSomething()时都要实例化的doSomethingElse()的新副本吗?

我不知道V8内部结构,但我认为闭包应该得到很好的优化。但要回答问题的另一部分:是的,每个
doSomething
调用都会创建一个新的
doSomethingElse
。这是从语言的角度讲的。从技术上讲,智能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;
  };
}());

您只需要记住,这将在所有
doSomething
调用中持续存在。因此,如果你做任何有状态的事情,你可能会看到一些意想不到的行为。

我不知道它优化得有多好,我不认为你会得到这样的信息,这种问题太广泛了,我知道,因为我以前问过这些问题,答案总是“试试看,配置文件,看看”

再说一次,我不会回答你的问题

我发现有两个源代码建议不要使用它们,因为它们为引擎添加了另一个步骤,因为它每次都需要创建函数,并为范围链添加了一个级别

具体原因和测试如下:


这可能应该在注释中,但我还不能注释。

这不是一个结束:没有来自
doSomething()
的变量被结束,这是一个值的直接返回。垃圾收集器可以在函数返回后从
doSomething()
的作用域中删除所有内容。@Mikemacana没错,您的原始示例可以是闭包,但由于嵌套函数只是接收一个要独占处理的
对象,而不是使用封闭变量,使用这种非闭包优化是有效的。