0

次のコードセグメントは、JavaScriptを使用した再帰呼び出しを示しています。

function timedCount()
{
document.getElementById('txt').value=c;
c=c+1;
t=setTimeout("timedCount()",1000);
}

ソースはここからです。

私の質問:これはスタックの蓄積とそれに続くスタックオーバーフローにつながりませんか?これは、PascalやC /C++などの言語では確かにクラッシュすることを私は知っています。

これについてのアドバイスをありがとう。

4

2 に答える 2

2

これは実際の再帰ではないため、深い呼び出しスタックは作成されません。


ただし、またはに文字列を渡さないでください。そうすることは使用するのと同じくらい悪いことであり、実際の変数を渡す代わりに文字列に変数を挿入する必要があるため、変数を使用するとすぐに読み取り不能で安全でない可能性のあるコードになります。setInterval()setTimeout()eval()

適切な解決策はsetTimeout(function() { /* your code *) }, msecs);です。同じことが。にも当てはまりますsetInterval()。引数なしで単一の関数を呼び出したい場合は、関数名を直接渡すこともできます:(関数名の後ろにはないsetTimeout(someFunction, msecs);ことに注意してください) ()

したがって、あなたの場合は、t = setTimeout(timedCount, 1000);

于 2012-05-10T06:09:14.413 に答える
1

これは再帰ではありません。timedCount()関数はそれ自体を呼び出していないため、指定された遅延の後に非同期setTimeout()で呼び出すようにJSに要求するように呼び出しています。次の行(この場合は関数の終わり)はすぐに実行され、タイムアウト後まで一時停止またはスリープしません。したがって、コード内の別の場所から呼び出すと、実行が終了し、制御がコードの他の部分に戻ります。その後、タイムアウトを介して関数が再度呼び出され、後で別の関数が実行されるようにスケジュールされます(およびなど、無限に)。実際の再帰の場合のように、別の実行が完了するのを途中で終了することはありません。timeCount() setTimeout()timedCount()timedCount()timedCount()

これを行った場合:

function timedCount() {
   // other code here

   timedCount();
}

...その後再帰が発生し、再帰を停止する条件が設定されていないため、実際にクラッシュします。再帰が「合理的な」数のレベルの深さを停止するように制御ロジックを追加すると、それで問題ありません。

于 2012-05-10T06:38:52.180 に答える