ホームページ  >  記事  >  ウェブフロントエンド  >  JS関数呼び出しスタックのスタックサイズの計算方法について

JS関数呼び出しスタックのスタックサイズの計算方法について

不言
不言オリジナル
2018-06-29 10:35:532641ブラウズ

この記事では、JS 関数呼び出しスタックのスタック サイズの計算方法に関する関連知識ポイントを共有します。興味のある方は参照してください。

自身を呼び出し続ける無限ループを作成すると、すぐに次のエラーが表示されます: Uncaught RangeError: 最大呼び出しスタック サイズを超えました。では、コールスタックのサイズはどれくらいでしょうか?

1. 計算方法

次の方法は、使用している JavaScript エンジンがサポートできる深さを計算できます (Ben Alman のコードからインスピレーションを受けています)。結果は次の 3 つです:

Node.js: 11034

    Firefox: 50994
  • Chrome: 10402
  • これらの数字は何を表していますか? Aleph 氏は、V8 では呼び出し可能なレイヤーの数は 2 つの側面に基づいていると教えてくれました: 1. スタックのサイズ、2. 各スタック フレーム (関数パラメーターとローカル変数の記録に使用される) のサイズ。 computeMaxCallStackSize でローカル変数を宣言してテストすると、数値が小さくなることがわかります。


    2. ECMAScript 6 の末尾再帰最適化

ECMAScript 6 は末尾再帰最適化をサポートしています。関数の最後の操作が関数呼び出しである場合、「サブコール」の代わりに「ジャンプ」が使用されます。つまり、computeMaxCallStackSize を次の形式に書き換えると、常に ES6 strict モードで実行されます。

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

3. コメントを強調表示

Andrei: コードの「ECMAScript 6」バージョンはまったく機能しません。サイズは変更されますが、最終的に値は返されません。

アンドレイへの返信: 興味深いですね!このコードを使用してスタック サイズを計算することはできません。 ES6 では、このコードは永久に実行されるため、データは返されません。それ以外の場合は RangeError が返されます。これを機能させるために、コードを書き直しました:

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP に注目してください。中国語のサイトです!関連する推奨事項:動的に追加されたラベルオブジェクトを取得するためのjuquery実装

以上がJS関数呼び出しスタックのスタックサイズの計算方法についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。