最近我遇到了一个问题:传递给eval()
函数时有效的JSON导致它抛出错误 - “脚本堆栈空间配额已耗尽”。JavaScript函数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()
是不安全的,所有...我接受建议!
FWIW,我在Chrome和IE 9(测试版)中测试了你的代码,它工作正常。在Firefox 3.6.8中超出堆栈空间。 – 2010-09-17 13:05:01