嵌套的辅助函数和性能

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)

这些例子过于简单,问题更多的是一般情况.

Rob*_*obG 8

工作实例化一次,但是日志实例化两次?

是的,每次打电话都要工作.

通常建议不要嵌套功能吗?

为什么不?我认为你暗示了性能问题.

练习是好还是坏取决于你使用它的原因.在简单的帮助器的情况下,最好将它们保持在本地,因为这意味着您可以使它们适合您的特殊情况,而不用担心一般功能的额外缺点.例如,填充前导零的数字:

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)

在闭包内多个函数使用日志的情况下,这也是有意义的.

请注意,对于单个案例,这非常微观优化,并且不太可能在性能上产生任何明显的差异.


Ben*_*Ben 6

嵌套的函数对象在LexicalEnvironment运行封闭函数时被实例化并添加到创建的对象中。这些嵌套函数中的每一个也将[[Scope]]在其上创建一个属性。此外,当运行嵌套函数时,LexicalEnvironment将创建一个新对象并将其[[Scope]]复制到其outer属性。

当封闭函数完成时,嵌套的函数对象及其关联的内存将有资格进行垃圾回收。

每次调用外部函数时都会重复此过程。

将此与您的第二个实现进行对比,其中函数对象只需要创建一次;同样它的垃圾收集。

如果这是一个“热”函数(即多次调用),那么第二种实现是无限可取的。