JavaScriptエンジンが何回再帰的な呼び出しを行うことができるか興味がありますか?
再帰通話の数
次の関数を使用すると、答えを見つけることができます:(ベンアルマンの要点に触発されています)
コードコピーは次のとおりです。
function ComputeMaxCallStackSize(){
試す {
1 + computeMaxCallStackSize()を返します。
} catch(e){
//スタックオーバーフローを呼び出します
返品1;
}
}
3つの結果:
コードコピーは次のとおりです。
node.js:11034
Firefox:50994
クロム:10402
これらの数字は何を表していますか?アレフ氏は、V8では、再帰呼び出しの数は、スタックのサイズとスタックフレームのサイズ(パラメーターを保持するローカル変数)の2つの量に依存することを指摘しました。 ComputeMaxCallStackSize()にローカル変数を追加することにより、低値を返すことを確認できます。
ECMAScript 6のテールコール最適化
ES6にはテールコールが最適化されています。関数の最後のステップも関数呼び出しである場合、サブ機能によって呼び出される代わりに「ジャンプ」されます。これは、ES6(Strict Mode)では、ComputeMaxCallStackSize関数を少し変更するだけで、永久に実行できることを意味します。
コードコピーは次のとおりです。
function ComputeMaxCallStackSize(size){
サイズ=サイズ|| 1;
ComputeMaxCallStackSize(size + 1)を返します。
}