tle*_*eef 6 javascript performance function
嵌套的辅助函数可以使您的代码更易于理解.Google甚至建议在其样式指南中使用嵌套函数.我想知道这些嵌套函数和性能的实例化.例如,
work(1);
work(2);
function work(a) {
// do some stuff
log();
// do some more stuff
function log() {
console.log(a);
}
}
Run Code Online (Sandbox Code Playgroud)
work实例化一次,但log实例化两次?
如果log每次work执行都被实例化,通常建议不要嵌套函数吗?相反,编写如下代码
work(1);
work(2);
function work(a) {
// do some stuff
log(a);
// do some more stuff
}
function log(a) {
console.log(a);
}
Run Code Online (Sandbox Code Playgroud)
这些例子过于简单,问题更多的是一般情况.
工作实例化一次,但是日志实例化两次?
是的,每次打电话都要工作.
通常建议不要嵌套功能吗?
为什么不?我认为你暗示了性能问题.
练习是好还是坏取决于你使用它的原因.在简单的帮助器的情况下,最好将它们保持在本地,因为这意味着您可以使它们适合您的特殊情况,而不用担心一般功能的额外缺点.例如,填充前导零的数字:
function pad(n) {
return (n<10? '0' : '') + n;
}
Run Code Online (Sandbox Code Playgroud)
作为一个辅助工作非常好,其中n预计总是在0到99的范围内,但作为一般功能缺少很多功能(处理非数字n,-ve数字等).
如果您担心性能,可以始终使用闭包,这样助手只会实例化一次:
var work = (function() {
function log() {
console.log(a);
}
return function (a) {
// do some stuff
log();
// do some more stuff
};
}());
Run Code Online (Sandbox Code Playgroud)
在闭包内多个函数使用日志的情况下,这也是有意义的.
请注意,对于单个案例,这非常微观优化,并且不太可能在性能上产生任何明显的差异.
嵌套的函数对象在LexicalEnvironment运行封闭函数时被实例化并添加到创建的对象中。这些嵌套函数中的每一个也将[[Scope]]在其上创建一个属性。此外,当运行嵌套函数时,LexicalEnvironment将创建一个新对象并将其[[Scope]]复制到其outer属性。
当封闭函数完成时,嵌套的函数对象及其关联的内存将有资格进行垃圾回收。
每次调用外部函数时都会重复此过程。
将此与您的第二个实现进行对比,其中函数对象只需要创建一次;同样它的垃圾收集。
如果这是一个“热”函数(即多次调用),那么第二种实现是无限可取的。
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |