最近我遇到了一个问题:传递给 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/