有时我看到如下代码:

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


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

最佳答案

我不了解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不变。因此,如果您做任何有状态的操作,都可能会看到一些意外的行为。

07-24 21:20