Apa arti ukuran tumpukan panggilan maksimum yang terlampaui dalam javascript?

Kesalahan “Uncaught RangeError. Ukuran tumpukan panggilan maksimum terlampaui” adalah umum di antara pemrogram yang bekerja dengan JavaScript. Itu terjadi ketika panggilan fungsi melebihi batas tumpukan panggilan

Mari kita lihat kesalahan secara detail dan solusinya juga.   

Apa yang Anda maksud dengan Kesalahan Stack Panggilan Maksimum?

Kesalahan ini disebabkan terutama karena alasan berikut -

Fungsi Rekursif Non-Terminasi

Browser Anda akan mengalokasikan sejumlah memori untuk semua tipe data dari kode yang Anda jalankan. Namun alokasi memori ini ada batasnya. Saat Anda memanggil fungsi rekursif, lagi dan lagi, batas ini terlampaui dan kesalahan ditampilkan

Jadi, panggil fungsi rekursif dengan hati-hati agar berhenti setelah kondisi tertentu terpenuhi. Ini akan mencegah tumpukan panggilan maksimum meluap dan kesalahan tidak akan muncul

Rentang Bermasalah

Beberapa program JS memiliki rentang masukan yang dapat diberikan oleh pengguna. Program lain memiliki fungsi yang mungkin berada di luar jangkauan. Saat ini terjadi, browser seperti Google Chrome akan memberi Anda pesan Uncaught RangeError. Tetapi Internet Explorer akan macet

Untuk mencegah hal ini, selalu periksa validitas rentang input dan bagaimana fungsi bekerja dengan rentang tersebut

Mari kita lihat sebuah contoh

Contoh

Penjelasan

Dalam contoh di atas, kami secara rekursif memanggil fun_first() karena kesalahannya adalah Uncaught RangeError ditemui. Fungsi rekursif dipanggil, yang kemudian memanggil fungsi lain, dan berlanjut hingga melebihi batas tumpukan panggilan.    

Larutan

Kita harus memanggil fungsi rekursif dengan kondisi If. Ketika kode memenuhi kondisi, eksekusi fungsi dihentikan

Contoh Kode

Dalam contoh di atas, kami telah membuat kondisi if untuk memeriksa nilai i. Jika nilai i mencapai 10, fungsi yang sama tidak akan dipanggil lagi

Kesimpulan

Uncaught RangeError disebabkan ketika ukuran tumpukan hardcode browser terlampaui dan memori habis. Jadi, pastikan selalu bahwa fungsi rekursif memiliki kondisi dasar yang dapat menghentikan eksekusinya.    

Kesalahan "RentangKesalahan yang Tidak Tertangkap. Ukuran tumpukan panggilan maksimum terlampaui" kesalahan terjadi di JavaScript saat Anda tidak menentukan kondisi keluar untuk fungsi rekursif Anda. Ambil yang berikut ini sebagai contoh

const test = () => test()

// ❌ This will throw "Uncaught RangeError: Maximum call stack size exceeded"
test()

Disalin ke papan klip. Salin

Fungsi ini akan memanggil dirinya sendiri tanpa batas waktu, menyebabkan kesalahan "Ukuran tumpukan panggilan maksimum terlampaui". Anda mungkin juga menemukan kesalahan ini dalam bentuk lain, seperti di bawah ini, tetapi penyebabnya akan sama

"Uncaught InternalError: Too much recursion"

Untuk memperbaiki kesalahan, kami perlu memberikan kondisi keluar. Anda dapat melakukan ini dengan membungkus panggilan di dalam pernyataan bersyarat. Ambil kode berikut sebagai contoh

const countDown = num => {
    if (num > 0) {
        console.log(num)
        countDown(num - 1)
    }
}
_

Disalin ke papan klip. Salin

Ini juga merupakan fungsi rekursif yang memanggil dirinya sendiri dan akan mengeluarkan angka hingga mencapai 0. Perhatikan bahwa kita memanggil fungsi dengan "argumen yang sama - 1". Artinya pada pemanggilan tertentu, kondisi tersebut tidak akan terpenuhi, artinya kita akan menghentikan eksekusi fungsi tersebut. Dengan cara ini, kami tidak akan mencapai ukuran tumpukan panggilan maksimum, karena kami memiliki kondisi keluar

Ingin meningkatkan keterampilan Anda?

Apa arti ukuran tumpukan panggilan maksimum yang terlampaui dalam javascript?

Loop tak terbatas

Kesalahan "Ukuran tumpukan panggilan maksimum terlampaui" tidak hanya dapat terjadi dengan fungsi rekursif, tetapi juga dengan loop tak terbatas. Paling umum, ini bisa terjadi saat menggunakan while loop

Cara umum untuk memastikan while loop Anda memiliki kondisi keluar adalah dengan mengurangi nilai pada setiap iterasi. Lihatlah contoh berikut

i = 100

while (i--) {
    console.log(i)
}

Disalin ke papan klip. Salin

Setelah i mencapai 0, itu akan dievaluasi sebagai false, artinya kita akan berhenti mengeksekusi while loop. Dalam hal ini, ini adalah kondisi keluar kita

Bagaimana mengatasi ukuran tumpukan panggilan maksimum terlampaui dalam JavaScript?

Jika kesalahan ini ditemukan saat memanggil fungsi rekursif, harus dipastikan bahwa fungsi memiliki kasus dasar yang ditentukan untuk mengakhiri panggilan rekursif . Jika kesalahan ini terjadi karena terlalu banyak pemanggilan fungsi atau variabel, ini harus dikurangi sebanyak mungkin.

Berapa ukuran tumpukan panggilan maksimum dalam JavaScript?

Konsekuensi menerapkan fungsi dengan terlalu banyak argumen (pikirkan lebih dari puluhan ribu argumen) bervariasi di seluruh mesin ( JavaScriptCore memiliki batas argumen hard-coded 65536), because the limit (indeed even the nature of any excessively-large-stack behavior) is unspecified.

Apa itu tumpukan panggilan dalam JavaScript?

Tumpukan panggilan adalah mekanisme untuk juru bahasa (seperti juru bahasa JavaScript di browser web) untuk melacak tempatnya dalam skrip yang memanggil beberapa fungsi — what function is currently being run and what functions are called from within that function, etc.