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没错,您的原始示例可以是闭包,但由于嵌套函数只是接收一个要独占处理的对象,而不是使用封闭变量,使用这种非闭包优化是有效的。