JavaScript 函数 eval() 抛出堆栈外配额异常

标签 javascript json

最近我遇到了一个问题:传递给 eval() 函数的有效 JSON 导致它抛出错误——“脚本堆栈空间配额已用尽”。

它始终是可重现的,并且通过初步检查,这似乎是对可以定义的对象属性/属性数量的限制(而不是内容的大小)。

示例代码如下:

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() 并不安全,而且...我愿意接受建议!

最佳答案

意思就是它所说的。 eval 显然是在使用递归,在评估长而复杂的 JSON 文字时,您超出了您的限制。它适用于 JSON.parse(至少在 Firefox 3.6.11pre 中),这是完成这项工作的正确工具,often faster .

关于JavaScript 函数 eval() 抛出堆栈外配额异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735452/

相关文章:

android - 未知的 Android 部署 JSON 文件位置

c# - 具有继承自 Dictionary<T,V> 的类的 JSON 序列化

Javascript 生成器问题 - 解释这段代码

javascript - Express.js (nodejs) 出现 ENOTFOUND 错误

javascript - Django 表单上的 Jquery 模态确认提交以删除对象

java - 在 Jersey 中处理 Null XML 负载

javascript - 具有多个触发菜单的 jQuery UI 选项卡

javascript - 如果 div 为空,则不应显示标题

java - 避免不断检查以确保 json 对象包含元素

json - 想要在perl中读取JSON文件字符串(多个值)