1. ホーム
  2. javascript

[解決済み] javascript: 再帰的匿名関数?

2022-06-28 10:13:41

質問

基本的な再帰的関数があるとします。

function recur(data) {
    data = data+1;
    var nothing = function() {
        recur(data);
    }
    nothing();
}

無名関数がある場合、どのようにすればよいのでしょうか...

(function(data){
    data = data+1;
    var nothing = function() {
        //Something here that calls the function?
    }
    nothing();
})();

この関数を呼び出した関数を呼び出す方法が欲しいのですが・・・。呼び出された関数の名前を教えてくれるスクリプトをどこかで見たことがあるのですが(どこかは思い出せません)、今はその情報を思い出せません。

どのように解決するのですか?

あなたは できる 関数を "関数宣言" 文ではなく値として作成しているときでも、関数に名前を付けることができます。つまり

(function foo() { foo(); })();

はスタックブロウな再帰関数です。 さて、そうは言っても、あなたは はおそらく はやりたくないかもしれません。 は、Javascriptの様々な実装に奇妙な問題があるため、一般的には行わない方が良いでしょう。( ノート - はかなり古いコメントです。Kangax のブログ記事で説明されている問題のいくつか/多く/すべては、よりモダンなブラウザでは修正されているかもしれません)。

このような名前を付けると、その名前は関数の外からは見えません (まあ、見えるはずもないのですが。これは奇妙な点の 1 つです)。 これは Lisp における "letrec" のようなものです。

に関しては arguments.callee に関しては、それは "strict" モードで禁止されており、いくつかの最適化を困難にするため、一般に悪いことと考えられています。 また、期待されるよりもずっと遅いです。

編集

- 自分自身を呼び出すことができる "anonymous"関数の効果を持ちたい場合、次のようにすることができます(関数をコールバックか何かとして渡していると仮定して)。

asyncThingWithCallback(params, (function() {
  function recursive() {
    if (timeToStop())
      return whatever();
    recursive(moreWork);
  }
  return recursive;
})());

これは何をするかというと、素敵で安全で壊れないIEで関数を定義することです 宣言 ステートメントで関数を定義し、その名前がグローバルな名前空間を汚染しないローカル関数を作成します。ラッパー(本当に匿名)関数は、そのローカル関数を返すだけです。