Ошибка: рекурсия цикла бесконечности javascript [дубликат]

Ну, простыми словами:

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

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

0
задан Mike Thomsen 20 February 2011 в 19:04
поделиться

2 ответа

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

См. Исправленную версию: http://jsfiddle.net/fkling/uYXYh/

Вы могли бы улучшить код, используя больше методов jQuery:

function buildList(point) {
    if (!point) return [];
    var children = [];
    point.children('li').each(function() {
        var parts = this.id.split('-');
        var newObj = {
            id: parts[1],
            mtype: parts[0],
            label: $(this).children('div').text()
        };
        var $ol = $(this).children('ol');
        if ($ol.length == 1) {
            newObj['childobjects'] = buildList($ol);
        }
        children.push(jQuery.extend(true, {}, newObj)); // not sure why you are
                                                        // doing this instead of
                                                        // children.push(newObj)
    });
    return children;
}

DEMO

4
ответ дан Felix Kling 27 August 2018 в 06:49
поделиться

Похоже, что index объявляется глобальной переменной и получает мутацию при каждом вызове buildList. Я думаю, что это ваша проблема (но, возможно, вы делаете это специально для чего-то, чего я не вижу). Попробуйте изменить свой оператор for:

for(var index=0; index < lis.length; index++){
    // ...
}
1
ответ дан roto 27 August 2018 в 06:49
поделиться
Другие вопросы по тегам:

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