この記事では、JS 関数呼び出しスタックのスタック サイズの計算方法に関する関連知識ポイントを共有します。興味のある方は参照してください。
自身を呼び出し続ける無限ループを作成すると、すぐに次のエラーが表示されます: Uncaught RangeError: 最大呼び出しスタック サイズを超えました。では、コールスタックのサイズはどれくらいでしょうか?
1. 計算方法
次の方法は、使用している JavaScript エンジンがサポートできる深さを計算できます (Ben Alman のコードからインスピレーションを受けています)。結果は次の 3 つです:
Node.js: 11034
ECMAScript 6 は末尾再帰最適化をサポートしています。関数の最後の操作が関数呼び出しである場合、「サブコール」の代わりに「ジャンプ」が使用されます。つまり、computeMaxCallStackSize を次の形式に書き換えると、常に ES6 strict モードで実行されます。
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
Andrei: コードの「ECMAScript 6」バージョンはまったく機能しません。サイズは変更されますが、最終的に値は返されません。
アンドレイへの返信: 興味深いですね!このコードを使用してスタック サイズを計算することはできません。 ES6 では、このコードは永久に実行されるため、データは返されません。それ以外の場合は RangeError が返されます。これを機能させるために、コードを書き直しました:
function computeMaxCallStackSize(size) { size = size || 1; return computeMaxCallStackSize(size + 1); }
上記がこの記事の全内容です。その他の関連コンテンツについては、PHP に注目してください。中国語のサイトです!関連する推奨事項:動的に追加されたラベルオブジェクトを取得するためのjuquery実装
以上がJS関数呼び出しスタックのスタックサイズの計算方法についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。