ошибка превышения максимального размера стека вызовов

<p>это означает, что где-то в вашем коде вы вызываете функцию, которая, в свою очередь, вызывает другую функцию и так далее, пока не достигнете предела стека вызовов.</p><p>это почти всегда из-за рекурсивной функции с базовым случаем, который не выполняется.</p><h3>просмотр стека</h3><p>рассмотрим этот код ...</p><pre><code>(function a() { a(); })(); </code></pre><p>вот стек после нескольких вызовов ...</p><p><img src="https://i.stack.imgur.com/aswnu.png" alt="web inspector"></p><p>как видите, стек вызовов растет до тех пор, пока не достигнет предела: размер стека в жестком коде браузера или исчерпание памяти.</p><p>чтобы исправить это, убедитесь, что у вашей рекурсивной функции есть базовый случай, который можно встретить ...</p><pre><code>(function a(x) { // the following condition // is the base case. if ( ! x) { return; } a(--x); })(10); </code></pre>

<p>иногда это можно получить, если вы случайно импортировали/внедрили один и тот же js-файл дважды, что стоит проверить на вкладке ресурсов инспектора :)</p>

<p>в моем случае я отправлял элементы ввода вместо их значений:</p><pre><code>$.post( '',{ registername: $('#registername') } ) </code></pre><p>вместо:</p><pre><code>$.post( '',{ registername: $('#registername').val() } ) </code></pre><p>это заморозило мою вкладку chrome до такой степени, что даже не отображало диалоговое окно «ждать/убивать», когда страница перестала отвечать на запросы ...</p>

<p>где-то в вашем коде есть рекурсивный цикл (то есть функция, которая в конечном итоге вызывает себя снова и снова, пока стек не заполнится).</p><p>другие браузеры либо имеют большие стеки (так что вместо этого вы получаете тайм-аут), либо они по какой-то причине проглатывают ошибку (может быть, неправильно размещенный try-catch).</p><p>используйте отладчик для проверки стека вызовов при возникновении ошибки.</p>

<p>в моем случае я преобразовывал большой байтовый массив в строку, используя следующее:</p><pre><code>string.fromcharcode.apply(null, new uint16array(bytes)) </code></pre><p><code>bytes</code> содержал несколько миллионов записей, что слишком велико для размещения в стеке.</p>

<p>если по какой-то причине вам нужен бесконечный процесс/рекурсия, вы можете использовать веб-работника в отдельном потоке . <a href="http://www.html5rocks.com/en/tutorials/workers/basics/">http://www.html5rocks.com/en/tutorials/workers/basics/</a> </p><p>если вы хотите манипулировать элементами dom и перерисовывать, используйте animation <a href="http://creativejs.com/resources/requestanimationframe/">http://creativejs.com/resources/requestanimationframe/</a> </p>

<p>проверьте подробности ошибки в консоли панели инструментов chrome dev, это даст вам функции в стеке вызовов и проведет вас к рекурсии, которая вызывает ошибку.</p>

<p>в моем случае событие click распространялось на дочерний элемент. итак, мне пришлось поставить следующее:</p><blockquote> <p>e.stoppropagation ()</p> </blockquote><p>по событию клика:</p><pre><code> $(document).on("click", ".remove-discount-button", function (e) { e.stoppropagation(); //some code }); $(document).on("click", ".current-code", function () { $('.remove-discount-button').trigger("click"); }); вот html-код: <div class="current-code"> <input type="submit" name="removediscountcouponcode" value=" title="remove" class="remove-discount-button">  

в моем случае два мода jquery показывали друг на друге. предотвращение, которое решило мою проблему. 

проверьте, есть ли у вас функция, которая вызывает сама себя. например export default class dateutils { static now = (): date => { return dateutils.now() } } 

если вы работаете с google maps, то проверьте, передаются ли последние символы в new google.maps.latlng. в моем случае они передавались как неопределенные. 

у меня была эта ошибка, потому что у меня было две функции js с одинаковым именем

вы можете найти свою рекурсивную функцию в браузере chrome, нажмите ctrl + shift + j, а затем вкладку исходного кода, которая дает вам процесс компиляции кода, и вы можете найти, используя точку останова в коде.

оба вызова идентичного кода ниже, если его уменьшить на 1, работают в chrome 32 на моем компьютере, например. 17905 против 17904. при запуске как есть они выдают ошибку «rangeerror: превышен максимальный размер стека вызовов». похоже, что этот предел не является жестко заданным, но зависит от аппаратного обеспечения вашей машины. похоже, что если он вызывается как функция, то этот добровольный предел выше, чем если бы он вызывался как метод, т. е. этот конкретный код использует меньше памяти при вызове как функция.вызывается как метод:var ninja = { chirp: function(n) { return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp"; } }; ninja.chirp(17905); вызывается как функция:function chirp(n) { return n > 1 ? chirp( n - 1 ) + "-chirp" : "chirp"; } chirp(20889); 

проблема в моем случае заключается в том, что у меня есть дочерний маршрут с тем же путем, что и родительский:const routes: routes = [ { path: '', component: homecomponent, children: [ { path: '', redirectto: 'home', pathmatch: 'prefix' }, { path: 'home', loadchildren: './home.module#homemodule' }, ] } ]; поэтому мне пришлось убрать линию детского маршрутаconst routes: routes = [ { path: '', component: homecomponent, children: [ { path: 'home', loadchildren: './home.module#homemodule' }, ] } ]; 

недавно мы добавили поле на сайт администратора, над которым мы работаем - contact_type ... easy right? что ж, если вы вызываете select "type" и пытаетесь отправить его через вызов jquery ajax, это завершится неудачно с этой ошибкой, скрытой глубоко в jquery.js. не делайте этого:$.ajax({ datatype: "json", type: "post", url: "/some\_function.php", data: { contact\_uid:contact\_uid, type:type } }); </code></pre><p>проблема в том, что type: type - я считаю, что мы называем аргумент «type» - наличие значения переменной с именем type не является проблемой. мы изменили это на:</p><pre><code>$.ajax({ datatype: "json", type: "post", url: "/some_function.php", data: { contact_uid:contact_uid, contact_type:type } }); и переписал some_function.php соответственно - проблема решена.

в моем случае я получаю эту ошибку при вызове ajax, и данные, которые я пытался передать этой переменной, не определены, то есть показывает эту ошибку, но не описывает эту переменную, не определенную. я добавил определил, что переменная n получила значение.

я знаю, что эта ветка старая, но я думаю, что стоит упомянуть сценарий, в котором я нашел эту проблему, чтобы она могла помочь другим.предположим, у вас есть такие вложенные элементы:<a href="#" id="profile-avatar-picker"> <span class="fa fa-camera fa-2x"> <input id="avatar-file" name="avatar-file" type="file" style="display: none;" />  вы не можете манипулировать событиями дочернего элемента внутри события его родителя, потому что он распространяется на самого себя, делая рекурсивные вызовы, пока не будет сгенерировано исключение.так что этот код не удастся:$('#profile-avatar-picker').on('click', (e) => { e.preventdefault(); $('#profilepicturefile').trigger("click"); }); </code></pre><p>у вас есть два варианта, чтобы избежать этого:</p><ul> <li>переместите ребенка наружу от родителя.</li> <li>применить <a href="https://developer.mozilla.org/en-us/docs/web/api/event/stoppropagation">stoppropagation</a> функцию к дочернему элементу.</li> </ul>

<p>я столкнулся с той же проблемой я решил ее, удалив имя поля, которое дважды использовалось в ajax например</p><pre><code> jquery.ajax({ url : '/search-result', data : { searchfield : searchfield, searchfieldvalue : searchfield, nid : nid, indexname : indexname, indextype : indextype }, ..... </code></pre>