Я использую файл библиотеки JavaScript Direct Web Remoting (DWR) и получаю сообщение об ошибке только в Safari (для ПК и iPad)
Это говорит
Превышен максимальный размер стека вызовов.
Что именно означает эта ошибка и останавливает ли она обработку полностью?
Также любое исправление для Safari
браузера (на самом деле iPad Safari
, он говорит
JS: превышено время ожидания выполнения
я предполагаю, что это та же проблема стека вызовов)
data
AJAX. Исправлена ошибка с объявлением переменных.Ответы:
Это означает, что где-то в вашем коде вы вызываете функцию, которая в свою очередь вызывает другую функцию и так далее, пока не достигнете предела стека вызовов.
Это почти всегда из-за рекурсивной функции с базовым случаем, который не выполняется.
Просмотр стека
Рассмотрим этот код ...
Вот стек после нескольких вызовов ...
Как видите, стек вызовов увеличивается до тех пор, пока не достигнет предела: размер стека в жестком коде браузера или исчерпание памяти.
Чтобы исправить это, убедитесь, что у вашей рекурсивной функции есть базовый случай, который можно встретить ...
источник
Иногда вы можете получить это, если вы случайно импортируете / внедрите один и тот же файл JavaScript дважды, стоит проверить это на вкладке ресурсов инспектора.
источник
В моем случае я отправлял элементы ввода вместо их значений:
Вместо:
Это заморозило мою вкладку Chrome до такой степени, что даже не отображало диалоговое окно «Ждать / убивать», когда страница перестала отвечать на запросы ...
источник
Где-то в вашем коде есть рекурсивный цикл (т.е. функция, которая в конечном итоге вызывает себя снова и снова, пока стек не заполнится).
Другие браузеры либо имеют большие стеки (так что вместо этого вы получаете тайм-аут), либо они по какой-то причине проглатывают ошибку (может быть, неправильно размещенный try-catch).
Используйте отладчик для проверки стека вызовов при возникновении ошибки.
источник
Проблема с обнаружением стекового потока иногда заключается в том, что трассировка стека раскручивается, и вы не сможете увидеть, что на самом деле происходит.
Я нашел некоторые из новых инструментов отладки Chrome полезными для этого.
Нажмите
Performance tab
, убедитесь, чтоJavascript samples
включены, и вы получите что-то вроде этого.Это довольно очевидно, где переполнение здесь! Если вы нажмете на кнопку,
extendObject
вы сможете увидеть точный номер строки в коде.Вы также можете увидеть время, которое может или не может быть полезным или красная сельдь.
Еще один полезный трюк, если вы не можете найти проблему, - это поместить множество
console.log
утверждений там, где вы думаете, что проблема. Предыдущий шаг выше может помочь вам в этом.В Chrome, если вы неоднократно выводите одинаковые данные, он будет отображаться так, как показано, где проблема более ясна. В этом случае стек достиг 7152 фреймов, прежде чем окончательно рухнул:
источник
В моем случае я преобразовывал большой байтовый массив в строку, используя следующее:
bytes
содержал несколько миллионов записей, что слишком велико для размещения в стеке.источник
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
В моем случае событие click распространялось на дочерний элемент. Итак, мне пришлось поставить следующее:
по событию клика:
Вот HTML-код:
источник
Проверьте подробности ошибки в консоли панели инструментов Chrome dev, это даст вам функции в стеке вызовов и проведет вас к рекурсии, которая вызывает ошибку.
источник
Если по какой-то причине вам нужен бесконечный процесс / рекурсия, вы можете использовать веб-работника в отдельном потоке. http://www.html5rocks.com/en/tutorials/workers/basics/
если вы хотите манипулировать элементами dom и перерисовывать, используйте анимацию http://creativejs.com/resources/requestanimationframe/
источник
Почти каждый ответ здесь утверждает, что это может быть вызвано только бесконечным циклом. Это неправда, в противном случае вы могли бы перегрузить стек с помощью глубоко вложенных вызовов (не говоря уже о том, что это эффективно, но, безусловно, это возможно). Если у вас есть контроль над вашей виртуальной машиной JavaScript, вы можете настроить размер стека. Например:
node --stack-size=2000
Смотрите также: Как я могу увеличить максимальный размер стека вызовов в Node.js
источник
В моем случае два мода jQuery показывали сложенными друг на друга. Предотвращение, которое решило мою проблему.
источник
Недавно мы добавили поле на сайт администратора, над которым мы работаем - contact_type ... easy right? Что ж, если вы вызываете select "type" и пытаетесь отправить его через вызов jquery ajax, это завершится неудачно с этой ошибкой, скрытой глубоко в jquery.js. Не делайте этого:
Проблема в том, что type: type - я считаю, что мы называем аргумент «type» - наличие значения переменной с именем type не является проблемой. Мы изменили это на:
И переписал some_function.php соответственно - проблема решена.
источник
Проверьте, есть ли у вас функция, которая вызывает сама себя. Например
источник
Это также может вызвать
Maximum call stack size exceeded
ошибку:Тоже самое:
Из документов Mozilla :
Поэтому постарайтесь:
источник
Оба вызова идентичного кода ниже, если его уменьшить на 1, работают в Chrome 32 на моем компьютере, например, 17905 против 17904. При запуске как есть они выдают ошибку «RangeError: Превышен максимальный размер стека вызовов». Похоже, что этот предел не является жестко заданным, но зависит от аппаратного обеспечения вашей машины. Похоже, что если он вызывается как функция, то этот добровольный предел выше, чем если бы он вызывался как метод, т.е. этот конкретный код использует меньше памяти при вызове как функция.
Вызывается как метод:
Вызывается как функция:
источник
Вы можете найти свою рекурсивную функцию в браузере crome, нажмите Ctrl + Shift + J, а затем вкладку исходного кода, которая дает вам процесс компиляции кода, и вы можете найти, используя точку останова в коде.
источник
Я также столкнулся с подобной проблемой, вот детали при загрузке логотипа с помощью выпадающего окна загрузки логотипа
CSS.css
до исправления мой код был:
Ошибка в консоли:
Я решил это, удалив
onclick="$('#filePhoto').click()"
из тега div.источник
Я столкнулся с той же проблемой, я решил ее, удалив имя поля, которое использовалось дважды на AJAX, например
источник
Я знаю, что эта ветка старая, но я думаю, что стоит упомянуть сценарий, в котором я нашел эту проблему, чтобы она могла помочь другим.
Предположим, у вас есть такие вложенные элементы:
Вы не можете манипулировать событиями дочернего элемента внутри события его родителя, потому что он распространяется на самого себя, делая рекурсивные вызовы, пока не будет сгенерировано исключение.
Так что этот код потерпит неудачу:
У вас есть два варианта, чтобы избежать этого:
источник
У меня была эта ошибка, потому что у меня было две функции JS с одинаковым именем
источник
Если вы работаете с картами Google, то проверьте, правильно ли передаются
new google.maps.LatLng
данные о широте. В моем случае они передавались как неопределенные.источник
Проблема в моем случае заключается в том, что у меня есть дочерний маршрут с тем же путем, что и родительский:
Поэтому мне пришлось убрать линию детского маршрута
источник
в моем случае я получаю эту ошибку при вызове ajax, и данные, которые я пытался передать этой переменной, не определены, то есть показывает эту ошибку, но не описывает эту переменную, не определенную. Я добавил определил, что переменная n получила значение.
источник
Столкнулся с той же проблемой, не понимая, что не так, начал обвинять Бабеля;)
Наличие кода, не возвращающего никаких исключений в браузерах:
проблема была плохо создана || (или) part, поскольку babel создает собственную проверку типа:
так что удаление
сделал вавилонскую транспиляцию.
источник
В моем случае я по ошибке присвоил одно и то же имя переменной и функции val "class_routine_id"
должно быть вроде:
источник
в Angular, если вы используете mat-select и имеете 400+ опций, эта ошибка может возникать https://github.com/angular/components/issues/12504
Вы должны обновить @ угловой / материал версии
источник
Я использую React-Native 0.61.5 вместе с ( npm 6.9.0 & node 10.16.1 )
Пока я устанавливаю любые новые библиотеки в Project, я получил
(например, npm install @ реагировать-навигация / родной --save)
Ошибка превышения максимального размера стека вызовов
для этого я стараюсь
sudo npm cache очистить --force
(Примечание: - Команда ниже, как правило, занимает от 1 до 2 минут в зависимости от размера кэша npm )
источник
Иногда это происходит из-за типа данных для преобразования, например, у вас есть объект, который вы рассматриваете как строку.
socket.id в nodejs либо в клиенте js, например, не является строкой. чтобы использовать его как строку, вы должны добавить слово String перед:
источник
Я пытался присвоить переменную, значение, когда эта переменная не была объявлена.
Объявление переменной исправило мою ошибку.
источник