1

私が読んでいる本からいくつかのコードを分析していますが、少し混乱する小さな部分があります:

//... some code

setTimeout(function(){
   //...some code
   if(some condition)
      setTimeout(arguments.callee, 0);
}, 0);

私にとって少し混乱しているのは、同じ本が「呼び出し先」プロパティが非推奨であり、厳密に必要でない限り使用すべきではないことを述べていることです (私は言い換えています)。したがって、これがそのようなケースの 1 つであるか、再帰呼び出しを実行するためのより良い方法があるかどうか疑問に思っています。インターネットのどこかで、次の方法で同じことを達成できる可能性があると読みました。

//... some code

setTimeout(function myRecursiveFunction(){
   //...some code
   if(some condition)
      setTimeout(myRecursiveFunction, 0);
}, 0);

これは正しいです?これにアプローチするより良い方法はまだありますか?Arguments.callee を使い続けても安全ですか?

明確にしていただきありがとうございます。

4

2 に答える 2

1

2 番目の方法が最適です。実際に行うことは、関数宣言を最も近い外側のスコープ (これが定義された関数) の先頭に「巻き上げ」、関数に「myRecursiveFunction」という名前を付けることです。

別の方法は、次のような匿名スコープを作成することです。

setTimeout(
    (function(){
        var myRecursiveFunction = function() {
            console.log(myRecursiveFunction);
        };
        return myRecursiveFunction
    }),
    1000
)

または、関数型プログラミングの固定小数点コンビネーターを使用することもできます。

于 2012-08-14T19:38:26.230 に答える
1

arguments.callee廃止され、削除される可能性があります。
また、ブラウザがコードを最適化するのが難しくなります。

あなたの2番目のアプローチは正しいです。
名前付きの無名関数 (関数式) を作成すると、関数式内のコードからその名前にアクセスできるようになります。

于 2012-08-14T19:36:06.277 に答える