有时我看到的代码如下:
var doSomething = function(object){
var results = []
var doSomethingElse = function(object){
...
}
results.push(doSomethingElse(...))
return results
}
以这种方式组织,因为doSomethingElse
只在doSomething
中有意义。性能是可以接受的,所以这只是一个好奇心:v8对嵌套函数的优化程度如何? 每次调用doSomething()时都会实例化doSomethingElse()的新副本吗?
答案 0 :(得分:0)
我不知道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
次来电中保持TransformOf
。因此,如果您做任何有状态的事情,您可能会看到一些意想不到的行为。
答案 1 :(得分:0)
我不知道它的优化程度如何,我认为你不会得到这样的信息,这类问题太宽泛了,我知道因为我之前已经问了这些问题,答案总是如此"尝试一下,简介并查看"。
然后,我不会回答这么说。
我发现有两个来源推荐使用AGAINST,因为它们为引擎添加了另一个步骤,因为它需要每次都创建函数,并为范围链添加一个级别。
这里的确切原因和测试:
http://code.tutsplus.com/tutorials/stop-nesting-functions-but-not-all-of-them--net-22315
https://developers.google.com/speed/articles/optimizing-javascript
这应该是评论,但我还不能发表评论。