Apakah Anda ingin tahu tentang berapa banyak panggilan rekursif yang dapat dilakukan oleh mesin JavaScript?
Berapa banyak panggilan rekursif
Fungsi berikut memungkinkan Anda untuk menemukan jawabannya: (Terinspirasi oleh Gist Ben Alman)
Salinan kode adalah sebagai berikut:
Function ComputeMaxCallStackSize () {
mencoba {
return 1 + computeMaxCallStackSize ();
} catch (e) {
// panggil stack overflow
kembali 1;
}
}
Tiga Hasil:
Salinan kode adalah sebagai berikut:
Node.js: 11034
Firefox: 50994
Chrome: 10402
Apa yang diwakili oleh angka -angka ini? Mr. Aleph menunjukkan bahwa dalam V8, jumlah panggilan rekursif tergantung pada dua jumlah: ukuran tumpukan dan ukuran bingkai tumpukan (variabel lokal yang memegang parameter). Anda dapat memverifikasi bahwa dengan menambahkan variabel lokal di ComputeMaxCallStackSize () - ia mengembalikan nilai rendah.
Optimalisasi Panggilan Ekor di Ecmascript 6
ES6 memiliki optimasi panggilan ekor: Jika langkah terakhir dalam suatu fungsi juga merupakan panggilan fungsi, itu akan "melompat" alih -alih dipanggil oleh subfungsi. Ini berarti bahwa dalam ES6 (mode ketat), Anda hanya perlu mengubah fungsi ComputeMaxCallSsize sedikit, dan dapat dieksekusi selamanya.
Salinan kode adalah sebagai berikut:
Function ComputeMaxCallStackSize (size) {
ukuran = ukuran || 1;
return computeMaxCallStackSize (ukuran + 1);
}