3

Node.js で次のコードを実行すると、次のエラーが発生します。

RangeError: Maximum call stack size exceeded

これはコードです:

var arr = [];
for (var i = 0; i <= 1000000; i++)
    arr.push(i);

function nextStep(index) {
    if (index === arr.length) {
        return;
    } else {
        console.log(index);
    }
    nextStep(++index);
}

nextStep(0);

何が起こっているのかわかりませんが、index = 17938 付近で実行が終了します。

を使用するとsetTimeout()役立ちます。ここで何が問題なのですか?

4

3 に答える 3

0

さまざまなブラウザーのコール スタックに基づいて、特定の数の呼び出しを行うことができます。ほとんどの場合、Chrome でコードをテストしています。これは、コール スタックが 20.000 に近いと思われるためです。コードはnextStep20.000 回 (100 万回) 以上関数を実行します。つまり、関数がその特定のブラウザーのコール スタック制限に達するまで何かを返さない場合、取得しているエラーが生成されます。

于 2013-11-12T18:52:46.477 に答える
0

nextStep 内で nextStep を呼び出すと、関数から戻ることがないため、スタック オーバーフローが発生します (配列の末尾が見つからない限り、また配列が大きすぎる場合は、スタック オーバーフローするまで配列に到達しません)。

例: すべての石をある場所から別の場所に移動します。あなたの役割は、石がある場所に行って、石を拾い、別の場所に届けるようなものです。しかし、石を届ける前に別の石を拾わなければならず、それを届ける前に別の石を拾う必要があります...そしてすぐに17938個の石を運ぶことになります。それは少し重すぎて、すべての石の下に押しつぶされます。(またはJavaScriptの場合は例外が発生します)

setTimetout を使用すると、その場所に行って石を拾い、別の石を拾う必要があることをメモするようなものです。それからあなたは石を届けます。その後、メモを見て、石を拾う必要があることがわかります。一度に 1 つの石しか運べないので、これを 1000000 回行うことができます。

于 2013-11-12T18:44:34.867 に答える