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

Я использую файл библиотеки JavaScript Direct Web Remoting (DWR) и получаю ошибку только в Safari (настольный компьютер и iPad).

Она гласит

Превышен максимальный размер стека вызовов.

Что именно означает эта ошибка и прекращает ли она обработку полностью?

Также любое исправление для браузера Safari (На самом деле на iPad Safari, он говорит.

JS:выполнение превысило таймаут

что, как я предполагаю, является той же проблемой стека вызовов)

Комментарии к вопросу (1)
Решение

Это означает, что где-то в вашем коде вы вызываете функцию, которая, в свою очередь, вызывает другую функцию и так далее, пока вы не достигнете предела стека вызовов.

Почти всегда это происходит из-за рекурсивной функции с базовым случаем, который не выполняется.

Просмотр стека

Рассмотрим этот код...

(function a() {
    a();
})();

Вот стек после нескольких вызовов...

Как видите, стек вызовов растет до тех пор, пока не достигнет предела: жестко закодированного размера стека браузера или исчерпания памяти.

Чтобы исправить это, убедитесь, что ваша рекурсивная функция имеет базовый случай, который может быть выполнен...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
Комментарии (16)

Иногда это может произойти, если вы случайно импортировали/вставили один и тот же файл JavaScript дважды, стоит проверить это на вкладке ресурсов в инспекторе.

Комментарии (6)

В моем случае, я посылал входных элементов вместо их значений:

$.post( '',{ registerName: $('#registerName') } )

Вместо:

$.post( '',{ registerName: $('#registerName').val() } )

Этот замер мой хром вкладки в точку, это не'т даже показать мне 'ожидание/убить' диалог, когда страница перестала отвечать на запросы...

Комментарии (1)

Где-то в вашем коде есть рекурсивный цикл (т.е. функция, которая в конечном итоге вызывает себя снова и снова, пока стек не заполнится).

В других браузерах стек либо больше (поэтому вместо него выдается тайм-аут), либо ошибка по какой-то причине проглатывается (возможно, неудачно расположенный try-catch).

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

Комментарии (3)

В моем случае, я был преобразования большого массива байтов в строку, используя следующие:

String.fromCharCode.apply(null, new Uint16Array(bytes))

"байт" содержится несколько миллионов записей, который является слишком большим, чтобы поместиться в стеке.

Комментарии (5)

Проблема с обнаружением stackoverflows иногда трассировка стека будет раскручиваться и вы выиграли'т быть в состоянии, чтобы увидеть, что'ов на самом деле происходит.

Я'вэ нашел некоторые кром'ы новые средства отладки полезны для этого.

Нажмите на вкладку производительности, убедитесь, что примеры JavaScript в настройках, и вы'll получить что-то вроде этого.

Это'ы довольно очевидно, где переполнение здесь! Если вы нажмете на extendObject вы'll быть в состоянии на самом деле увидеть точное количество строк в коде.

Вы также можете посмотреть тайминги, которые могут или не могут быть полезны или отвлекающий маневр.


Еще один полезный трюк, если вы можете'т действительно Найдите проблему-это поставить из консоли.заявления, журнал` где вы думаете, проблема. Предыдущий шаг выше смогут помочь вам в этом.

В Chrome, Если вы неоднократно выводить идентичные данные он будет отображать его, как это показывает, где эта проблема стоит более четко. В этом случае стек нажмите 7152 кадров, прежде чем он окончательно рухнул:

Комментарии (0)

В моем случае, щелкните событие, распространяющихся на дочерний элемент. Так, я должен поставить следующие:

электронная.это происходит()

на событие click:

 $(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">
   </div>
Комментарии (0)

Если вам нужен бесконечный процесс/рекурсия работает по какой-то причине, вы можете использовать webworker в отдельном потоке. http://www.html5rocks.com/en/tutorials/workers/basics/

если вы хотите манипулировать DOM-элементов и перекроить, использовать анимации http://creativejs.com/resources/requestanimationframe/

Комментарии (0)

Проверить информацию об ошибке в консоли инструментов разработчика Chrome, это даст вам функции в стеке вызовов, и направлять вас к рекурсии, что'ы вызывает ошибку.

Комментарии (0)

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

Комментарии (0)

Проверьте, если у вас есть функция, которая вызывает сама себя. Например

export default class DateUtils {
  static now = (): Date => {
    return DateUtils.now()
  }
}
Комментарии (0)

Недавно мы добавили поля в админ мы работаем на contact_type... просто так? Ну, если вы называете выбрать и"Тип" и попытаться отправить через jQuery с AJAX-вызов, он выдает эту ошибку похоронены глубоко в jquery.js Дон'т сделать это:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, type:type }
});

Проблема в том, что типа:Тип - я считаю, что это нас называя аргумент, что "типа„ - имеющий значение переменной типа Это'т проблема. Мы изменили это:

$.ajax({
    dataType: "json",
    type: "POST",
    url: "/some_function.php",
    data: { contact_uid:contact_uid, contact_type:type }
});

И переписал some_function.php соответственно - проблема решена.

Комментарии (0)

Это также может вызвать ошибку, максимальный размер стека вызовов превысило`:

var items = [];
[].push.apply(items, new Array(1000000)); //Bad

Же здесь:

items.push(...new Array(1000000)); //Bad

От Мозилла документы:

но будьте осторожны: при использовании применять этот способ, вы рискуете превысить движок JavaScript'ы длина аргумента предел. Последствия применения функции слишком много аргументов (думаю, что больше десятки тысячи аргументов) различаются от двигателей (JavaScriptCore имеет жестко аргумента предел 65536), потому что лимит (даже характер любых чрезмерно огромного стека поведения) является неуказанным. У некоторых двигателей будет бросать исключение. Более губительно, другие произвольно ограничивать число аргументов фактически переданные прикладная функция. Для иллюстрации последнего случая: если такой двигатель был предел четырех аргументов (фактических пределов конечно значительно выше), это как если бы аргументы 5, 6, 2, 3 было принято применять в приведенных выше примерах, а не полный массив.

Так попробовать:

var items = [];
var newItems = new Array(1000000);
for(var i = 0; i < newItems.length; i++){
  items.push(newItems[i]);
}
Комментарии (0)

Почти каждый ответ здесь говорится, что это может быть вызвано только бесконечный цикл. Что's не справедливо, вы могли бы по-работать стека через глубоко вложенных вызовов (не скажу, что'ы эффективно, но это'ы, конечно, в сфере возможного). Если у вас есть контроль над вашей виртуальной машины JavaScript, вы можете настроить размер стека. Например:

узел --стек-размер=2000

См. также: https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js

Комментарии (0)

Я знаю, что этот поток старая, но я думаю, что это's стоит отметить сценарий, я нашел эту проблему, поэтому он может помочь другим.

Предположим, у вас есть вложенные элементы, такие как этот:

<a href="#" id="profile-avatar-picker">
    <span class="fa fa-camera fa-2x"></span>
    <input id="avatar-file" name="avatar-file" type="file" style="display: none;" />
</a>

Нельзя манипулировать элементом события ребенка в случае его родитель, потому что он распространяет в себя рекурсивных вызовов до тех пор, пока исключение не бросали.

Так этот код завершится с ошибкой:

$('#profile-avatar-picker').on('click', (e) => {
    e.preventDefault();

    $('#profilePictureFile').trigger("click");
});

У вас есть два варианта избежать этого:

  • Переместить ребенка за пределы родителя.
  • Применить это происходит функция дочернего элемента.
Комментарии (0)

Обе вызовов ниже идентичного кода, если уменьшилось на 1 работу в Chrome 32 на моем компьютере, например, против 17904 17905. Если работать, как они будут производить ошибке "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);
Комментарии (0)

вы можете найти рекурсивную функцию в браузер кром,нажмите сочетание клавиш Ctrl+шифт+J и затем "источник" на вкладке, которая дает вам поток компиляции кода и вы можете найти, используя точки останова в коде.

Комментарии (1)

Я тоже столкнулась с подобной проблеме здесь детали при загрузке логотипа с помощью выпадающего логотип загрузки коробки

<div>
      <div class="uploader greyLogoBox" id="uploader" flex="64" onclick="$('#filePhoto').click()">

        <input type="file" name="userprofile_picture"  id="filePhoto" ngf-select="$ctrl.createUploadLogoRequest()"/>
        cloud_upload
        <div ng-if="!$ctrl.isLogoPresent" class="text">Drag and drop a file here, or click to upload</div>
      </div>
      <script type="text/javascript">
          var imageLoader = document.getElementById('filePhoto');
          imageLoader.addEventListener('change', handleImage, false);

          function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {

                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }
      </script>
      </div>

УСБ.УСБ

.uploader {
  position:relative;
  overflow:hidden;
  height:100px;
  max-width: 75%;
  margin: auto;
  text-align: center;

  img{
    max-width: 464px;
    max-height: 100px;
    z-index:1;
    border:none;
  }

  .drag-drop-zone {
    background: rgba(0, 0, 0, 0.04);
    border: 1px solid rgba(0, 0, 0, 0.12);
    padding: 32px;
  }
}

.uploader img{
  max-width: 464px;
  max-height: 100px;
  z-index:1;
  border:none;
}

.greyLogoBox {
  width: 100%;
  background: #EBEBEB;
  border: 1px solid #D7D7D7;
  text-align: center;
  height: 100px;
  padding-top: 22px;
  box-sizing: border-box;
}

#filePhoto{
  position:absolute;
  width:464px;
  height:100px;
  left:0;
  top:0;
  z-index:2;
  opacity:0;
  cursor:pointer;
}

до коррекции моего кода :

function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {
                  onclick="$('#filePhoto').click()"
                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }

Ошибку в консоли:

Я решил ее путем удаления `функция onclick=" и$('#filePhoto').нажмите кнопку()" и от тег div.

Комментарии (1)

Я был сталкивается с теми же проблема Я решил ее путем удаления имя поля, которое используется два раза на AJAX е.г

    jQuery.ajax({
    url : '/search-result',
    data : {
      searchField : searchField,
      searchFieldValue : searchField,
      nid    :  nid,
      indexName : indexName,
      indexType : indexType
    },
.....
Комментарии (0)

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

Комментарии (0)