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