Дополнительно
Ошибка превышения максимального размера стека вызовов
Я использую файл библиотеки JavaScript Direct Web Remoting (DWR) и получаю ошибку только в Safari (настольный компьютер и iPad).
Она гласит
Превышен максимальный размер стека вызовов.
Что именно означает эта ошибка и прекращает ли она обработку полностью?
Также любое исправление для браузера Safari
(На самом деле на iPad Safari
, он говорит.
JS:выполнение превысило таймаут
что, как я предполагаю, является той же проблемой стека вызовов)
473
20
Это означает, что где-то в вашем коде вы вызываете функцию, которая, в свою очередь, вызывает другую функцию и так далее, пока вы не достигнете предела стека вызовов.
Почти всегда это происходит из-за рекурсивной функции с базовым случаем, который не выполняется.
Просмотр стека
Рассмотрим этот код...
Вот стек после нескольких вызовов...
Как видите, стек вызовов растет до тех пор, пока не достигнет предела: жестко закодированного размера стека браузера или исчерпания памяти.
Чтобы исправить это, убедитесь, что ваша рекурсивная функция имеет базовый случай, который может быть выполнен...
Иногда это может произойти, если вы случайно импортировали/вставили один и тот же файл JavaScript дважды, стоит проверить это на вкладке ресурсов в инспекторе.
В моем случае, я посылал входных элементов вместо их значений:
Вместо:
Этот замер мой хром вкладки в точку, это не'т даже показать мне 'ожидание/убить' диалог, когда страница перестала отвечать на запросы...
Где-то в вашем коде есть рекурсивный цикл (т.е. функция, которая в конечном итоге вызывает себя снова и снова, пока стек не заполнится).
В других браузерах стек либо больше (поэтому вместо него выдается тайм-аут), либо ошибка по какой-то причине проглатывается (возможно, неудачно расположенный try-catch).
Используйте отладчик для проверки стека вызовов в момент возникновения ошибки.
В моем случае, я был преобразования большого массива байтов в строку, используя следующие:
"байт" содержится несколько миллионов записей, который является слишком большим, чтобы поместиться в стеке.
Проблема с обнаружением stackoverflows иногда трассировка стека будет раскручиваться и вы выиграли'т быть в состоянии, чтобы увидеть, что'ов на самом деле происходит.
Я'вэ нашел некоторые кром'ы новые средства отладки полезны для этого.
Нажмите на вкладку
производительности
, убедитесь, что примеры JavaScript в настройках, и вы'll получить что-то вроде этого.Это'ы довольно очевидно, где переполнение здесь! Если вы нажмете на
extendObject
вы'll быть в состоянии на самом деле увидеть точное количество строк в коде.Вы также можете посмотреть тайминги, которые могут или не могут быть полезны или отвлекающий маневр.
Еще один полезный трюк, если вы можете'т действительно Найдите проблему-это поставить из консоли.заявления, журнал` где вы думаете, проблема. Предыдущий шаг выше смогут помочь вам в этом.
В Chrome, Если вы неоднократно выводить идентичные данные он будет отображать его, как это показывает, где эта проблема стоит более четко. В этом случае стек нажмите 7152 кадров, прежде чем он окончательно рухнул:
В моем случае, щелкните событие, распространяющихся на дочерний элемент. Так, я должен поставить следующие:
на событие click:
Вот HTML код:
Если вам нужен бесконечный процесс/рекурсия работает по какой-то причине, вы можете использовать webworker в отдельном потоке. http://www.html5rocks.com/en/tutorials/workers/basics/
если вы хотите манипулировать DOM-элементов и перекроить, использовать анимации http://creativejs.com/resources/requestanimationframe/
Проверить информацию об ошибке в консоли инструментов разработчика Chrome, это даст вам функции в стеке вызовов, и направлять вас к рекурсии, что'ы вызывает ошибку.
В моем случае, были две библиотеки jQuery модальные глаголы, показывающие друг на друга. Допуская, что решить мою проблему.
Проверьте, если у вас есть функция, которая вызывает сама себя. Например
Недавно мы добавили поля в админ мы работаем на contact_type... просто так? Ну, если вы называете выбрать и"Тип" и попытаться отправить через jQuery с AJAX-вызов, он выдает эту ошибку похоронены глубоко в jquery.js Дон'т сделать это:
Проблема в том, что типа:Тип - я считаю, что это нас называя аргумент, что "типа„ - имеющий значение переменной типа Это'т проблема. Мы изменили это:
И переписал some_function.php соответственно - проблема решена.
Это также может вызвать ошибку, максимальный размер стека вызовов превысило`:
Же здесь:
От Мозилла документы:
Так попробовать:
Почти каждый ответ здесь говорится, что это может быть вызвано только бесконечный цикл. Что's не справедливо, вы могли бы по-работать стека через глубоко вложенных вызовов (не скажу, что'ы эффективно, но это'ы, конечно, в сфере возможного). Если у вас есть контроль над вашей виртуальной машины JavaScript, вы можете настроить размер стека. Например:
узел --стек-размер=2000
См. также: https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js
Я знаю, что этот поток старая, но я думаю, что это's стоит отметить сценарий, я нашел эту проблему, поэтому он может помочь другим.
Предположим, у вас есть вложенные элементы, такие как этот:
Нельзя манипулировать элементом события ребенка в случае его родитель, потому что он распространяет в себя рекурсивных вызовов до тех пор, пока исключение не бросали.
Так этот код завершится с ошибкой:
У вас есть два варианта избежать этого:
Обе вызовов ниже идентичного кода, если уменьшилось на 1 работу в Chrome 32 на моем компьютере, например, против 17904 17905. Если работать, как они будут производить ошибке "RangeError: максимальный размер стека вызовов превысило" по. Похоже, этот лимит не жестко, но зависит от оборудования вашей машины. Представляется, что если вызывается как функция это добровольное ограничение выше, чем при вызове в качестве метода, т. е. именно этот код использует меньше памяти при вызове в качестве функции.
Вызывается как метод:
Вызывается как функция:
вы можете найти рекурсивную функцию в браузер кром,нажмите сочетание клавиш Ctrl+шифт+J и затем "источник" на вкладке, которая дает вам поток компиляции кода и вы можете найти, используя точки останова в коде.
Я тоже столкнулась с подобной проблеме здесь детали при загрузке логотипа с помощью выпадающего логотип загрузки коробки
УСБ.УСБ
до коррекции моего кода :
Ошибку в консоли:
Я решил ее путем удаления `функция onclick=" и$('#filePhoto').нажмите кнопку()" и от тег div.
Я был сталкивается с теми же проблема Я решил ее путем удаления имя поля, которое используется два раза на AJAX е.г
Я имел эту ошибку, потому что у меня было два JS функции с тем же именем