有时,我看到的代码如下:
var doSomething = function(object){
var results = []
var doSomethingElse = function(object){
...
}
results.push(doSomethingElse(...))
return results
}组织方式是这样的,因为doSomethingElse在doSomething中只有意义。性能是可以接受的,因此这只是一个好奇: v8如何对嵌套函数进行优化?是每次调用doSomething()时实例化doSomethingElse()的一个新副本?
发布于 2016-01-15 12:33:45
我不知道V8内部结构,但闭包应该是很好的优化,我认为。但要回答您问题的另一部分:是的,每个doSomething调用都会创建一个新的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。因此,如果您做了任何有状态的事情,您可能会看到一些意想不到的行为。
发布于 2016-01-15 12:53:38
我不知道它的优化程度有多好,我认为你永远不会得到这样的信息,这种问题太宽泛了,我知道,因为我以前问过这些问题,答案总是“试一试,分析一下”。
话又说回来,我不会回答这个问题。
我发现有两个源代码建议不要使用这些资源,因为它们为引擎添加了另一个步骤,因为引擎每次都需要创建函数,并向范围链添加一个级别。
这里的确切原因和测试如下:
http://code.tutsplus.com/tutorials/stop-nesting-functions-but-not-all-of-them--net-22315
https://developers.google.com/speed/articles/optimizing-javascript
这可能应该在评论中,但我还不能评论。
https://stackoverflow.com/questions/34811144
复制相似问题