TL; DR: Agregar funciones no incorporadas a Array.prototype AND Function.prototype provocará que el analizador JSON nativo de IE8 obtenga un desbordamiento de la pila al analizar cualquier JSON que contiene una matriz, pero solo cuando también pasa una función de reactivación a JSON.parse().El error JSON.parse nativo de IE8 provoca el desbordamiento de la pila
Esto comenzó como una pregunta, pero respondí mi propia pregunta original, así que ahora voy a preguntar: ¿alguien puede pensar en una solución para este error IE8 que no implica eliminar todas las bibliotecas JS que modifican Array.prototype y Function.prototype?
pregunta original:
Tengo alrededor de 13k de datos JSON para analizar. La estructura de los datos es un objeto con un único valor que es una matriz anidada.
{ 'value':[[ stuff ], [ more stuff], [ etc ]] }
estoy usando json2.js, que se remite a la nativa del navegador JSON.parse cuando esté disponible. Paso una función reviver en JSON.parse para manejar las fechas correctamente. Cuando IE8 está en modo de emulación IE7 (lo que hace que use el analizador json2.js basado en script) todo funciona bien. Cuando IE8 está en modo IE8 (lo que hace que use el analizador JSON nativo del navegador) explota con un error de "falta de espacio en la pila". Firefox y Chrome, por supuesto, funcionan bien con sus analizadores JSON nativos del navegador.
Lo he reducido a esto: si paso incluso una función reviver do-nothing en JSON.parse, el analizador nativo IE8 obtiene el desbordamiento de la pila. Si paso sin función de reactivación, el analizador nativo IE8 funciona bien, excepto que no analiza las fechas correctamente.
// no error:
JSON.parse(stuff);
// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });
Voy a jugar con mis datos JSON, para ver si menos datos o menos de anidación de los datos se puede evitar el error, pero me preguntaba si alguien había visto esto antes, o ha tenido cualquier otro sugerido problemas de trabajo. IE8 ya es lo suficientemente lento, sería una pena deshabilitar JSON nativo para ese navegador debido a este error.
ACTUALIZACIÓN: En otros casos, con diferentes datos JSON, obtengo un error de javascript "$ lineinfo no está definido" cuando uso el analizador nativo IE8 con una función reviver y no hay error si no uso la función reviver. La cadena "$ lineinfo" no aparece en ningún lugar de ninguno de mis códigos fuente.
ACTUALIZACIÓN 2: En realidad, este problema parece ser causado por el prototipo 1.6.0.3. No pude reproducirlo en una página de prueba aislada hasta que agregué en la biblioteca Prototype.
Actualización 3:
La razón prototype.js rompe el analizador JSON nativo IE8 es la siguiente: La adición de cualquiera que no sea incorporado en las funciones de Array.prototype Y Function.prototype hará que el analizador JSON nativo para obtener IE8 un desbordamiento de pila al analizar cualquier JSON que contenga una matriz, pero solo cuando también pasa una función de reactivación a JSON.parse().
La biblioteca Prototype agrega funciones tanto a Array.prototype como a Function.prototype, pero esto se aplica igualmente a cualquier otra biblioteca que haga lo mismo. Este error en el analizador de IE JSON está expuesto por Prototype y Ext, pero no jQuery. No he probado otros marcos.
Aquí hay una reproducción completamente independiente del problema. Si elimina la línea Function.prototype, o la línea Array.prototype, o quita la matriz de la cadena JSON, no obtendrá el error "out of stack space".
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };
window.onload = function()
{
alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}
</script>
</head>
<body>
</body>
</html>
El equipo de JavaScript informa que este es un problema conocido en el motor de JavaScript. Gracias. – EricLaw
Gracias por avisarme. –