RangError: слишком много аргументов для вызова функции - PullRequest
0 голосов
/ 23 октября 2018

Я получил хорошее решение для получения комментариев HTML из дерева узлов HTML

var findComments = function(el) {
    var arr = [];
    for (var i = 0; i < el.childNodes.length; i++) {
        var node = el.childNodes[i];
        if (node.nodeType === 8) {
            arr.push(node);
        } else {
            arr.push.apply(arr, findComments(node));
        }
    }
    return arr;
};

var commentNodes = findComments(document);

// whatever you were going to do with the comment...
console.log(commentNodes[0].nodeValue);

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

var arr = [];
var findComments = function(el) {

    for (var i = 0; i < el.childNodes.length; i++) {
        var node = el.childNodes[i];
        if (node.nodeType === 8) {
            arr.push(node);
        } else {
            arr.push.apply(arr, findComments(node));
        }
    }
    return arr;
};
var commentNodes = findComments(document);

//I added this

for (var counter = arr.length; counter > 0; counter--) {
    console.log(commentNodes[counter].nodeValue);
}

Я продолжаю получать это сообщение об ошибке:

RangeError: слишком много аргументов для вызова функцииeval код отладчика: 9: 13

РЕДАКТИРОВАТЬ: У меня была опечатка во время вставки изменил код с i-- на счетчик -

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

см. Этот комментарий в MDN-документах об использовании apply для объединения массивов:

Не используйте этот метод, если второй массив (moreVegs в примере)очень большой, потому что максимальное количество параметров, которое может принимать одна функция, на практике ограничено.См. Apply () для более подробной информации.

другое примечание от apply page :

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

0 голосов
/ 23 октября 2018

Добавление цикла for - не единственное, что вы изменили (и посмотрите другой ответ о том, как исправить этот цикл).Вы также переместили объявление arr из внутри функции наружу, сделав arr относительно глобальным.

Из-за этого каждый рекурсивный вызов findComments() работает на тот же массив , а вызов .apply() каждый раз возвращает все содержимое обратно в конец массива.Через некоторое время его длина превышает предел времени выполнения.

Исходная функция, размещенная в верхней части вашего вопроса, имеет arr, объявленную внутри функции.Поэтому каждый рекурсивный вызов имеет свой собственный локальный массив для работы.В документе с много узлов комментариев он все же может получить эту ошибку диапазона, однако.

0 голосов
/ 23 октября 2018

Поскольку массив начинается с индекса 0, на самом деле последний элемент в массиве равен arr.length - 1.

. Вы можете исправить это следующим образом:

for (var counter = arr.length - 1; counter >= 0; counter--)

Обратите внимание, что я добавилarr.length -1 и counter >= 0 в качестве нуля - первый индекс массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...