v8 优化嵌套函数的程度如何
How well does v8 optimise nested functions?
有时我看到这样的代码:
var doSomething = function(object){
var results = []
var doSomethingElse = function(object){
...
}
results.push(doSomethingElse(...))
return results
}
以这种方式组织doSomethingElse
因为doSomething
中只有意义。性能是可以接受的,所以这只是一个好奇:v8 对嵌套函数的优化程度如何?每次调用doSomething()时,doSomethingElse()的新副本都会被实例化吗?
它的优化程度如何,我认为你永远不会得到这样的信息,那种问题太宽泛了,我知道,因为我以前问过这些问题,答案总是"尝试一下,剖析看看"。
话又说回来,我不会回答这么说。
我发现有 2 个来源建议 AGAINST 使用这些,因为它们为引擎添加了另一个步骤,因为它每次都需要创建函数,并向作用域链添加一个级别。
确切的原因和测试在这里:
http://code.tutsplus.com/tutorials/stop-nesting-functions-but-not-all-of-them--net-22315
https://developers.google.com/speed/articles/optimizing-javascript
这可能应该在评论中,但我还不能发表评论。
我不了解 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
调用中持续doSomethingElse
。因此,如果您执行任何有状态的操作,您可能会看到一些意外行为。
- 如何在JavaScript中将字符串转换为函数引用
- 如何在DOM元素上按类型构建此函数
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 如何在jQuery中将函数的输出分配给变量
- 如何在javascript函数中使用Razor值
- 如何在Javascript函数调用中循环变量
- 如何在.js函数中检索来自其他模板的表单的目标值
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- 应该如何在typescript中键入lodash流函数
- 如何在javascript中使用不止一个函数
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 如何在javascript回调函数中返回多个变量
- 如何在ES6类中使用参数调用函数
- 如何在javascript中使用嵌套函数作为生成器(使用“inner”yields)
- 鉴于 for..在构造中,库提供的函数(如 jQuery.map() 或 _.each())有什么用
- 如何在AngularJS中公开公共函数
- 如何在jQuery中将链接函数分配给变量
- 如何在Odoo 9中执行JS文件中的函数
- 试图理解一个在JS中有两个参数输入的函数(如函数X(param1)(param2))
- 将图像旋转不同程度的函数