Lebih
Maksimum call ukuran stack melampaui kesalahan
Saya menggunakan Web Langsung Remoting (DWR) JavaScript library file dan saya mendapatkan kesalahan hanya di Safari (desktop dan iPad)
Ia mengatakan
Maksimum call stack size terlampaui.
Apa sebenarnya maksud dari pesan error ini dan tidak berhenti pengolahan benar-benar?
Juga ada perbaikan untuk Safari
browser (benar-Benar di iPad Safari
, ini kata
JS:eksekusi melebihi batas waktu
yang saya mengasumsikan adalah panggilan yang sama tumpukan masalah)
473
28
Itu berarti bahwa di suatu tempat dalam kode anda, anda memanggil fungsi yang pada gilirannya memanggil fungsi lain dan sebagainya, sampai anda mencapai call stack batas.
Ini hampir selalu karena fungsi rekursif dengan basis kasus yang isn't terpenuhi.
Melihat tumpukan
Pertimbangkan ini kode...
Berikut ini adalah stack setelah beberapa panggilan...
Seperti yang anda lihat, panggilan stack tumbuh sampai menyentuh batas: browser hardcoded ukuran stack atau memori kelelahan.
Dalam rangka untuk memperbaiki ini, pastikan bahwa anda fungsi rekursif memiliki basis kasus yang dapat bertemu...
Anda bisa mendapatkan ini kadang-kadang jika anda secara tidak sengaja import/embed sama file JavaScript dua kali, senilai check di tab sumber daya inspektur.
Dalam kasus saya, saya mengirim input elemen-elemen yang bukan nilai-nilai mereka:
Bukannya:
Ini membeku saya tab Chrome ke titik itu didn't bahkan menunjukkan 'Menunggu/Membunuh' dialog untuk saat halaman menjadi tidak responsif...
Ada rekursif loop di suatu tempat dalam kode anda (yaitu fungsi yang akhirnya menyebut dirinya lagi dan lagi. sampai stack penuh).
Browser lain baik memiliki tumpukan yang lebih besar (sehingga anda mendapatkan timeout sebaliknya) atau mereka menelan error untuk beberapa alasan (mungkin parah ditempatkan try-catch).
Menggunakan debugger untuk memeriksa tumpukan panggilan ketika kesalahan terjadi.
Dalam kasus saya, saya mengubah besar byte array ke string dengan menggunakan kode berikut:
byte
terdapat beberapa juta entri, yang terlalu besar untuk muat pada stack.Masalah dengan mendeteksi stackoverflows kadang-kadang jejak stack akan bersantai dan anda tidak't dapat melihat apa yang's benar-benar terjadi.
I've ditemukan beberapa dari Chrome's baru debugging tools yang berguna untuk ini.
Memukul Kinerja tab
, pastikan
Javascript sampel` diaktifkan dan anda'll mendapatkan sesuatu seperti ini.It's cukup jelas mana yang meluap di sini! Jika anda klik pada
extendObject
anda'akan dapat benar-benar melihat tepat nomor baris dalam kode.Anda juga dapat melihat timing yang mungkin atau mungkin tidak membantu atau ikan merah.
Lain trik berguna jika anda dapat't benar-benar menemukan masalah adalah untuk menempatkan banyak
konsol.log
pernyataan di mana anda pikir masalahnya adalah. Sebelumnya langkah di atas dapat membantu anda dengan ini.Di Chrome jika anda berulang kali output data yang identik akan menampilkan seperti ini menunjukkan di mana masalahnya lebih jelas. Dalam hal ini misalnya tumpukan memukul 7152 frame sebelum akhirnya jatuh:
Dalam kasus saya, klik acara merambat pada elemen anak. Jadi, aku harus meletakkan berikut:
pada acara klik:
Berikut ini adalah kode html:
Jika anda membutuhkan sebuah proses yang tak terbatas/rekursi berjalan untuk beberapa alasan, anda dapat menggunakan webworker di thread terpisah. http://www.html5rocks.com/en/tutorials/workers/basics/
jika anda ingin memanipulasi elemen dom dan redraw, menggunakan animasi http://creativejs.com/resources/requestanimationframe/
Periksa rincian kesalahan di Chrome dev toolbar konsol, ini akan memberikan anda fungsi dalam panggilan stack, dan memandu anda menuju rekursi yang's menyebabkan kesalahan.
Dalam kasus saya, dua jQuery modals yang menunjukkan ditumpuk di atas satu sama lain. Mencegah yang memecahkan masalah saya.
Periksa jika anda memiliki sebuah fungsi yang memanggil dirinya sendiri. Misalnya
Kami baru saja menambahkan bidang ke admin situs kami sedang bekerja pada - contact_type... mudah kan? Nah, jika anda memanggil pilih "type" dan mencoba untuk mengirim melalui jquery ajax menyebutnya gagal dengan kesalahan ini terkubur jauh di dalam jquery.js Don't melakukan hal ini:
Masalahnya adalah bahwa jenis:jenis - saya percaya itu adalah kita penamaan argumen "type" - memiliki sebuah nilai variabel bernama jenis isn't masalah. Kami mengubah ini untuk:
Dan menulis ulang some_function.php dengan demikian - masalah yang dipecahkan.
Ini juga dapat menyebabkan
panggilan Maksimal ukuran stack melampaui
error:Sama di sini:
Dari Mozilla Docs:
Jadi cobalah:
Hampir setiap jawabannya di sini menyatakan bahwa hal ini hanya dapat disebabkan oleh loop tak terbatas. Yang's tidak benar, anda bisa jika tidak over-run stack melalui sangat bersarang panggilan (untuk tidak mengatakan bahwa's efisien, tapi itu's tentu dalam ranah mungkin). Jika anda memiliki kontrol JavaScript anda VM, anda dapat menyesuaikan ukuran stack. Misalnya:
simpul-stack-size=2000
Lihat juga: https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js
Aku tahu ini thread lama, tapi saya pikir itu's layak disebut skenario saya menemukan masalah ini sehingga dapat membantu orang lain.
Misalkan anda telah bersarang unsur-unsur seperti ini:
Anda tidak dapat memanipulasi elemen anak acara dalam acara induknya karena itu menjalar ke dirinya sendiri, membuat panggilan rekursif sampai pengecualian adalah throwed.
Jadi kode ini akan gagal:
Anda memiliki dua pilihan untuk menghindari hal ini:
Kedua doa yang identik kode di bawah ini jika mengalami penurunan sebesar 1 bekerja di Chrome 32 di komputer saya misalnya 17905 vs 17904. Jika berjalan seperti yang mereka akan menghasilkan kesalahan "RangeError: Maksimum call ukuran stack melampaui". Tampaknya menjadi batas ini tidak hardcoded tetapi tergantung pada perangkat keras dari komputer anda. Itu tidak muncul bahwa jika dipanggil sebagai fungsi diri ini dikenakan batas yang lebih tinggi daripada jika dipanggil sebagai metode yaitu ini kode tertentu menggunakan lebih sedikit memori ketika dipanggil sebagai fungsi.
Dipanggil sebagai metode:
Dipanggil sebagai fungsi:
anda dapat menemukan fungsi rekursif di crome browser,tekan ctrl+shift+j dan kemudian sumber tab, yang memberikan anda kode kompilasi mengalir dan anda dapat menemukan dengan menggunakan break point dalam kode.
Saya juga menghadapi masalah serupa, berikut adalah rincian ketika meng-upload logo menggunakan dropdown meng-upload logo kotak
CSS.css
sebelum koreksi kode saya :
Kesalahan di konsol:
Aku diselesaikan dengan menghapus
onclick="$('#filePhoto').klik()"
dari tag div.Saya menghadapi masalah yang sama Aku telah memutuskan hal ini dengan menghapus nama field yang digunakan dua kali pada ajax e.g
Aku punya kesalahan ini karena saya memiliki dua Fungsi JS dengan nama yang sama