4

在 JavaScript 和其他语言中,我听说过在调用方法/函数时会创建激活对象。为了优化和保持良好的性能,听起来开发人员应该限制调用的函数数量。

现在,如果没有办法绕过它并且您必须调用多个方法,那么最好一个接一个地调用一个方法,如下所示:

myFunc1();
myFunc2();
myFunc3();

// or...
var myFuncs = [myFunc1, myFunc2, myFunc3];
for(var a=0, aLen=myFuncs.length; a<aLen; a++) {
  myFuncs[a]();
}

或者,像这样嵌套它们:

function myFunc1() {
  // Do something...
  myFunc2();
}

function myFunc2() {
  // Do Something else...
  myFunc3();
}

function myFunc3() {
  //Do one last thing.
}

//Start the execution of all 3 methods:
myFunc1();

我假设使用第一种技术更有意义,因为它会回到以前的范围并释放最后一个激活对象......但如果有人能证实这一点,我真的很想知道!

谢谢

4

3 回答 3

3

为了优化和保持良好的性能,听起来开发人员应该限制调用的函数数量。

是和不是。函数(或更一般地,子程序)在那里被调用,不这样做是没有意义的。如果您可以通过引入另一个函数来使您的代码更加干燥,那么就这样做。

唯一不使用它们的地方是高性能循环,它运行数千次,几乎没有什么工作,函数调用会增加显着的开销。不要试图过早地优化

此外,有些语言不能很好地处理递归,您需要将递归函数调用转换为循环,以防止 stackoverflow 异常。然而,这也是一种罕见的情况。

一个接一个地调用一个方法,还是嵌套它们更好?

这取决于,因为这两种技术做不同的事情。使用#1,只有 3 个独立的函数,它们相互调用。相比之下,#2 定义了总是相互调用的函数——你不能myFunc2没有myFunc3. 这是故意的吗?

如果是,那么这种嵌套没有任何问题。两个额外的堆栈层不会损害您的性能。

于 2013-02-14T22:49:50.920 回答
1

有关激活对象的信息,请参阅http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/#more-546

然而,这不是优化级别的问题,因为您列出的问题是 EXTREME 预优化的一个示例,您的时间不值得这种类型的投资。实际上,在您上面列出的示例中,当您单独查看激活对象时几乎没有节省。

但是,至于正确使用,我尝试尽可能多地封装。如果一个函数不必进入全局范围,并且可以存在于另一个函数的范围内,那么这就是它应该声明的地方。

例如,为了更好地确定范围。


var f2 = function() {
}

var f1 = function() {
  f2()
}

// is not as nice as:

var f1 = function() {
  var f2 = function()

  f2()
}

// or even better.. 

var f1 = function() {
  function() {
  }()  ; execute
}

于 2013-02-14T21:12:54.167 回答
0

责任分离:

private function myFunc1(): void
{

}

private function myFunc2(): void
{

}

private function myFunc3(): void
{

}

private function doAllFunc(): void
{
     myFunc1();
     myFunc2();
     myFunc3();
}
于 2013-02-14T20:58:47.693 回答