Функция JavaScript eval () выбрасывает исключение квоты вне стека - PullRequest
4 голосов
/ 17 сентября 2010

Недавно я столкнулся с проблемой: допустимый JSON при передаче в функцию eval() вызывает ошибку - «квота пространства стека сценария исчерпана».

Он последовательно воспроизводим иПри первоначальном рассмотрении кажется, что это ограничение на количество атрибутов / свойств объекта, которые могут быть определены (а не размер содержимого).

Вот пример кода:

function starttest()
{      
       var d = new Array(50000);
       var i = 0;

       for (i = 0; i < d.length; i++) {
            d[i] = new Object();
            d[i].a1 = 1;
            d[i].a2 = 2;
            d[i].a3 = i;
            d[i].a4 = i;
            d[i].a5 = i;
            d[i].a6 = i;
            d[i].a7 = i;
            d[i].a8 = i;
            d[i].a9 = i;
            d[i].a10 = i;
            d[i].a11 = i;
            d[i].a12 = i;
            d[i].a13 = i;
            d[i].a14 = i;
            d[i].a15 = i;
       }       



    var jsonString = JSON.stringify(d);  
    alert(jsonString.length);

    var obj = eval(jsonString);
    var count = 0;
    for( var i = 0; i< obj.length; i++) {

        for (var k in obj[i]) {
            if (obj[i].hasOwnProperty(k)) {
               ++count;
            }
        }
    }

    alert("Done! || Len: " + obj.length + " || " + "Attrib Count: " + count + " || " + typeof obj)
}

Самое смешное, что я могу определить гораздо больше объектов, чем видно из фрагмента кода;проблема возникает только при использовании функции eval().

Любое новое понимание этого было бы очень полезно.Я знаю, что использование eval() небезопасно, и все ... и я открыт для предложений!

Ответы [ 3 ]

3 голосов
/ 17 сентября 2010

Это означает, что это говорит. eval, очевидно, использует рекурсию, и вы превышаете свой предел при оценке длинного и сложного литерала JSON. Он отлично работает с JSON.parse (по крайней мере, в Firefox 3.6.11pre), который является подходящим инструментом для работы, и часто быстрее .

1 голос
/ 17 сентября 2010

Да, это проблема с интерпретатором JavaScript Firefox в целом.Это не просто eval: если вы поместите пятьдесят тысяч строк:

{a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8,i:9,j:10,a2:1,b2:2,c2:3,d2:4,e2:5,f2:6,g2:7,h2:8,i2:9,j2:10},

в литерал массива в простом файле сценария или в элемент * <script>, вы получите точно такую ​​же ошибку.

Кажется, сложность блока скрипта ограничена временем компиляции JS_DEFAULT_SCRIPT_STACK_QUOTA.См. 420869 и связанные с ним ошибки.

Маловероятно, что вы встретите это в нормальных условиях.Конечно, для случая JSON вы можете использовать JSON.parse, который, не будучи полным интерпретатором JavaScript, не подвержен этому ограничению.Если вам нужен синтаксический анализатор недействительных JSON JS, который не затронут, я думаю, вам придется написать его самостоятельно ... хотя, вероятно, он будет раздражающе медленным, когда вы будете вводить это долго.

1 голос
/ 17 сентября 2010

Похоже, вы используете класс JSON для создания строки JSON.Почему бы просто не использовать противоположную функцию для строкового преобразования, чтобы вернуть JSON в синтаксис объекта?

http://www.json.org/json_parse.js - это класс JSON Javsacript.Просто вызовите json_parse (str);и вы получите хороший предмет обратно.

Как вы сами сказали, eval () небезопасен.Это чертовски правильное зло!

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