0
function findSequence(goal) {
   var find = function (start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

var sequence = findSequence(24);

sequence閉鎖関数ですか?はいの場合、この方法でクロージャーを使用することをお勧めしますか? 閉鎖を避けるために、Webリソースから教えられました。

アップデート:

コメントで、Web リソースを表示するように求められました。これらは、私が Web で見た信頼性の高いリソースです。

1. MDN -「パフォーマンスに関する考慮事項」の閉鎖。

2. 「ガベージ コレクション - 閉鎖」の下の Addy Osmani の記事。

3. MSDN - 「閉鎖」セクションを参照してください。

4.スタック オーバーフロー ポスト- 受け入れられた回答を参照してください。

5.スタック オーバーフロー ポスト

6.別の興味深い記事- 最後の 2 つの段落を参照してください。

4

4 に答える 4

2

いいえ、sequenceまったく機能しません。だからそれは閉鎖ではありません。

find関数はクロージャーです再帰的に呼び出さgoalれ、親スコープからの変数への参照を維持します。findSequenceただし、コールが終了しても存続しないため、この機能は使用しません。ここでは、再帰のための追加関数の使用は非常に優れています。

私は閉鎖を避けるように教えられました。

その必要はありません。もう少しメモリが必要かもしれませんが、気にしないでください。それらが重宝し (そのパワーのために非常に頻繁に発生します)、それらが有用であるとわかった場合は、それらを使用してください時期尚早の最適化を行わないでください。実際のパフォーマンスの問題が発生した場合にのみ、それらの回避策を検討することができます。

于 2013-07-12T11:00:08.443 に答える
1

シーケンスはクロージャ関数ですか?

いいえ。スコープ内で再帰を行うだけです。

于 2013-07-12T10:59:44.120 に答える
0

sequenceからの戻り値が割り当てられる変数ですfindSequence(24);

于 2013-07-12T11:02:57.140 に答える