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

最適化して良好なパフォーマンスを維持するために、開発者は呼び出される関数の数を制限する必要があるようです。

はいといいえ。関数 (またはより一般的にはサブルーチン) は呼び出されるためにあり、そうしないと意味がありません。別の関数を導入することでコードをより DRY にすることができる場合は、そうしてください。

それらを使用しないことが合理的である唯一の場所は、ほとんど作業を行わずに何千回も実行される高性能ループであり、関数呼び出しにより顕著なオーバーヘッドが追加されます時期尚早に最適化しようとしないでください。

また、再帰をうまく処理できず、再帰関数呼び出しをループに変換してスタックオーバーフロー例外を防ぐ必要がある言語もあります。ただし、これもまれなケースです。

メソッドを次々と呼び出すのと、ネストするのとではどちらがよいでしょうか?

2 つの手法は異なることを行うため、状況によって異なります。#1 では、互いに呼び出される独立した関数が 3 つだけあります。対照的に、#2 は常に相互に呼び出す関数を定義します -myFunc2なしでは取得できませんmyFunc3。それは意図したものですか?

そうであれば、このネスティングに問題はありません。追加の 2 つのスタック レイヤーによってパフォーマンスが損なわれることはありません。

于 2013-02-14T22:49:50.920 に答える
1

アクティベーション オブジェクトに関する情報については、 http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/#more-546を参照してください。

ただし、これは最適化レベルの問題ではありません。リストした問題は極端な事前最適化の例であり、時間はそのタイプの投資に値しないためです。実際、上に挙げた例では、Activation Objects だけを見ている場合、節約できるものはほとんどありません。

ただし、適切な使用に関しては、できる限りカプセル化するようにしています。関数がグローバル スコープに入る必要がなく、別の関数のスコープ内に存在できる場合は、その関数を宣言する必要があります。

たとえば、スコーピングを改善するためです。


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 に答える