0

グローバル スコープを汚染する心配がなく、関数 b() が呼び出される唯一の場所が関数 a() である場合、パフォーマンスの点で次のうちどれがより良い解決策ですか?

var v;
function a()
{
    function b()
    {
        v*=v;
    }
    v=5;
    b();
}
a();

また

var v;
function a()
{
    v=5;
    b();
}
function b()
{
    v*=v;
}
a();
4

2 に答える 2

2

シンボルを使用すると、関連する値が一連の環境で検索されます。内側の環境から外側に向かって進みます。これは、内部 (ローカル) 環境がグローバル環境よりも最初に検出されることを意味しますが、パフォーマンスに実際の違いはありません。

採用するソリューションを選択するには、次のことを自問してください。

  • 内部関数は、将来、他の関数に役立つ可能性がありますか?

そうでない場合は、

  • 他の場所で役立つ可能性がある、より一般的な関数を作成する方法で内部関数を抽象化できますか?
于 2013-06-15T12:48:23.567 に答える
0

3年後の私の質問を見て、より満足のいく答えを提供したいと思います.

内部関数が別の場所で使用される場合は、入れ子にしないでください。明らかな理由で。

function a(){
  // ...
}
function b(){
  // ...
  a();
}

a();
b();

内部関数が他の場所で使用されない場合は、ネストします。見た目がすっきりし、外部関数の論理的整合性が向上します (関連するものは視覚的に囲まれています)。

function b(){
  function a(){
    // ...
  }

  // ...
  a();
}

b();

内部関数が他の場所で使用されず、外部関数が複数回呼び出される場合は、それからクロージャを作成し、囲まれたスコープで内部関数を定義します。 このようにして、呼び出しごとに再定義されることはありません。これは、内部関数が複雑である場合や、外部関数が何度も呼び出される場合に、より意味があります。

var b = (function b(){
  function a(){
    // ...
  }

  return function(){
    // ...
    a();
  };
}());

b();
b();

その他のパフォーマンスへの影響はごくわずかです。

于 2016-10-21T14:16:28.973 に答える