Uncaught RangeError: превышен максимальный размер стека вызовов - laravel 5.6 [duplicate]

У меня было это с

  1. Заглавная буква в моих ресурсах с возможностью рисования.
  2. Импорт Android.R, добавленный Android Studio (или Eclipse)
  3. Ошибка в файле xml
375
задан Gonzalo.- 3 May 2017 в 18:22
поделиться

22 ответа

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

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

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

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

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

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

Web Inspector [/g1]

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

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

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
435
ответ дан Mark Amery 19 August 2018 в 11:40
поделиться
  • 1
    Thx много для этого. Есть ли способ / инструмент, с помощью которого я могу, что предел стека исчерпан. Хотя, поскольку это огромный файл библиотеки, а не созданный мной, я не совсем понимаю, где все может пойти не так. – testndtv 23 May 2011 в 11:08
  • 2
    @Oliver Если вам нужно запустить функцию почти 300 триллионов раз, , вы, вероятно, делаете что-то неправильно. – ceejayoz 30 December 2014 в 22:07
  • 3
    @Oliver - возможно, вы захотите изучить динамическое программирование - полагаю, у вас нет такого уникального решения, вы повторяете шаги, поэтому вам может потребоваться запрограммировать его как полиномиальное, а не квадратичное. en.wikipedia.org/wiki/Dynamic_programming – newshorts 24 May 2015 в 21:04
  • 4
    @Akhoy В обычной функции да, но подумайте о рекурсивной функции. Он вызывает другое (сам) и оставляет обратный адрес первого в стеке (в противном случае, где компьютер знал, куда идти?) Это, конечно, снова вызывает себя, каждый раз нажимая обратный адрес в стек. Когда это ускользнет из-за базового футляра, который вряд ли встретится в следующем столетии, вы получите переполнение стека. – alex 19 January 2016 в 13:56
  • 5
    Сладкий голи Иисус! Ваш код работает с таким же неэффективным сегментом 134217728 раз. Не шутите, что он медленно. Вы должны использовать побитовые операторы, чтобы вы могли развернуть 9 уровней циклов на один уровень циклов. – Jack Giffin 29 March 2017 в 22:54

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

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

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

21
ответ дан Aaron Digulla 19 August 2018 в 11:40
поделиться
  • 1
    Thx много для вашего ответа. В IE / FF код, похоже, работает нормально ... Только в настольных Safari и iPad Safari я получаю сообщение об ошибке. На самом деле JS-файл не является моим собственным созданием, но является файлом библиотеки (из DWR engine.js) .. directwebremoting.org Также, когда вы говорите «отладчик, чтобы проверить стек вызовов», как я делаю это с помощью Safari Inspector? – testndtv 23 May 2011 в 10:58
  • 2
    У меня нет опыта работы с Safari Inspector. Попробуйте открыть отладчик JavaScript и загрузить свою страницу. Отладчик должен остановиться, когда будет выведена неповрежденная ошибка. Если это не сработает, спросите у суперпользователя или веб-мастера (см. Внизу страницы) – Aaron Digulla 23 May 2011 в 12:53
  • 3
    имеет 2 функции, названных одинаковыми! DOH! – jharris8567 2 June 2014 в 19:10

Проблема в моем случае состоит в том, что у меня есть маршрут для детей с одним и тем же путем с родителем:

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' },
    ]
  }
];
0
ответ дан Amine Harbaoui 19 August 2018 в 11:40
поделиться

В моем случае два модажа jQuery отображались друг на друга. Предотвращение этой проблемы.

1
ответ дан Barry Guvenkaya 19 August 2018 в 11:40
поделиться

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

5
ответ дан chim 19 August 2018 в 11:40
поделиться

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

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

5
ответ дан Dr. Dama 19 August 2018 в 11:40
поделиться

Оба вызова идентичного кода ниже, если оно уменьшено на 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);
0
ответ дан Elijah Lynn 19 August 2018 в 11:40
поделиться

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

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

Вместо:

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

Это заморозило мою вкладку Chrome до такой степени, что она даже покажите мне диалоговое окно «Wait / Kill», когда страница становится невосприимчивой ...

28
ответ дан FKasa 19 August 2018 в 11:40
поделиться

Я использую Devexpress Scheduler в Angular, и проблема заключается в неправильном использовании переменной, назначенной тегу datasource планировщика.

0
ответ дан Fouad Kajj 19 August 2018 в 11:40
поделиться

Иногда это происходит из-за преобразования типа данных, например, у вас есть объект, который вы считаете строкой.

socket.id в nodejs либо в js-клиенте в качестве примера, не является строкой. для использования в качестве строки вам нужно добавить слово String до:

String(socket.id);
0
ответ дан Hussein mahyoub 19 August 2018 в 11:40
поделиться

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

0
ответ дан iceDragon 19 August 2018 в 11:40
поделиться

В моем случае событие click распространялось по дочернему элементу. Итак, мне пришлось поставить следующее:

e.stopPropagation ()

при событии клика:

 $(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>
4
ответ дан Jase 19 August 2018 в 11:40
поделиться

Вы можете иногда получить это, если вы случайно импортируете / вставляете один и тот же JS-файл дважды, стоит проверить вкладку ваших ресурсов инспектора:)

64
ответ дан lucygenik 19 August 2018 в 11:40
поделиться
  • 1
    Интересно, как происходит эта проблема. – Farid Nouri Neshat 15 May 2014 в 12:27
  • 2
    Не могли бы вы объяснить, почему это так? Это не очевидно для многих из нас! – rvighne 21 June 2014 в 06:41
  • 3
    Обычно эта проблема возникает, когда вы случайно импортируете / вставляете один и тот же JS-файл дважды. Точный процесс, который вызывает рекурсивный цикл, не является чем-то, на что я хочу размышлять, однако я бы предположил, что это что-то вроде вождения двух одинаковых автомобилей со скоростью 100 миль в час через один и тот же платный шлюз. – lucygenik 22 June 2014 в 22:03
  • 4
    Я не думаю, что это так. Если в него встроены два одинаковых типа функций или переменных, последний будет переопределять предыдущие определения. – ssudaraka 27 October 2017 в 09:48
  • 5
    Да ... Я действительно не знаю, почему это происходит или что происходит в этом процессе, но я бы это сделал. – lucygenik 29 October 2017 в 21:12

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

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

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

8
ответ дан Nate Glenn 19 August 2018 в 11:40
поделиться
  • 1
    У меня тоже была такая же проблема с той же линией !! Thanx – Karthik Hande 5 July 2017 в 11:14
  • 2
    так что самое лучшее решение для преобразования большого массива байтов? – Karthik Hande 5 July 2017 в 11:14
  • 3
    @KarthikHande Вы должны сделать это в цикле for вместо одного вызова. var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))}); – Nate Glenn 6 July 2017 в 05:41
  • 4
    как я могу преобразовать это в JSON? Я пробовал JSON.parse, но он не работал ... Я использую Uintl8Array – Karthik Hande 6 July 2017 в 13:07
  • 5
    @ KarthikHande Я не могу сказать, не видя всей проблемы. Пожалуйста, откройте еще один вопрос со всеми подробностями. – Nate Glenn 7 July 2017 в 09:44

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

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

Нажмите Performance tab, убедитесь, что Javascript samples включены, и вы получите что-то вроде этого.

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

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


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

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

6
ответ дан Simon_Weaver 19 August 2018 в 11:40
поделиться

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

<div>
      <div class="uploader greyLogoBox" id="uploader" flex="64" onclick="$('#filePhoto').click()">
        <img id="imageBox" src="{{ $ctrl.companyLogoUrl }}" alt=""/>
        <input type="file" name="userprofile_picture"  id="filePhoto" ngf-select="$ctrl.createUploadLogoRequest()"/>
        <md-icon ng-if="!$ctrl.isLogoPresent" class="upload-icon" md-font-set="material-icons">cloud_upload</md-icon>
        <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>

CSS.css

.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').click()" из тега div.

0
ответ дан spacedev 19 August 2018 в 11:40
поделиться

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

    jQuery.ajax({
    url : '/search-result',
    data : {
      searchField : searchField,
      searchFieldValue : searchField,
      nid    :  nid,
      indexName : indexName,
      indexType : indexType
    },
.....
0
ответ дан Tajdar Khan Afridi 19 August 2018 в 11:40
поделиться

Если вы работаете с картами google, тогда проверьте, передаются ли lat lng в new google.maps.LatLng, соответствующего формата. В моем случае они передавались как неопределенные.

0
ответ дан User-8017771 19 August 2018 в 11:40
поделиться

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

0
ответ дан Vishal Patel 19 August 2018 в 11:40
поделиться
  • 1
    Иногда, однако, трудно понять, откуда возникла ошибка. На нашем сайте есть много JavaScript. – Mathias Lykkegaard Lorenzen 16 April 2015 в 13:47

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

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

<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");
});

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

  • Переместить дочерний элемент в сторону родителя.
  • Применить функцию stopPropagation для дочерний элемент.
0
ответ дан Weslley Ramos 19 August 2018 в 11:40
поделиться

Другая опция, которая вызывает эту ошибку. Если вы конвертируете в json с сокетом.

export class User {
  constructor(socket: Socket, name: string) { 
     this.socket = socket;
     this.name   = name;
  }

   name   : string;
   socket : Socket;
}

...
let json: string = JSON.stringify(user);
0
ответ дан yit770 19 August 2018 в 11:40
поделиться
1
ответ дан asifaftab87 30 October 2018 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: