tengo este pedazo de código:JavaScript expresiones regulares persiste literales entre llamadas a funciones
function func1(text) {
var pattern = /([\s\S]*?)(\<\?(?:attrib |if |else-if |else|end-if|search |for |end-for)[\s\S]*?\?\>)/g;
var result;
while (result = pattern.exec(text)) {
if (some condition) {
throw new Error('failed');
}
...
}
}
Esto funciona, a menos que se ejecute la sentencia throw. En ese caso, la próxima vez que llamo a la función, la llamada a exec() comienza donde se quedó, aunque le proporciono un nuevo valor de 'texto'.
puedo solucionarlo escribiendo
patrón var = new RegExp ('.....');
en su lugar, pero no entiendo por qué la primera versión está fallando. ¿Cómo persiste la expresión regular entre las llamadas a funciones? (Esto está ocurriendo en las últimas versiones de Firefox y Chrome.)
Editar caso de prueba completo:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
</style>
<script type='text/javascript'>
function func1(text, count) {
var pattern = /(one|two|three|four|five|six|seven|eight)/g;
log("func1");
var result;
while (result = pattern.exec(text)) {
log("result[0] = " + result[0] + ", pattern.index = " + pattern.index);
if (--count <= 0) {
throw "Error";
}
}
}
function go() {
try { func1("one two three four five six seven eight", 3); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
try { func1("one two three four five six seven eight", 99); } catch (e) { }
try { func1("one two three four five six seven eight", 2); } catch (e) { }
}
function log(msg) {
var log = document.getElementById('log');
var p = document.createElement('p');
p.innerHTML = msg;
log.appendChild(p);
}
</script>
</head>
<body><div>
<input type='button' id='btnGo' value='Go' onclick='go();'>
<hr>
<div id='log'></div>
</div></body>
</html>
La expresión regular continúa con 'cuatro' a partir de la segunda llamada en FF y Chrome, no en IE7 u Opera.
Me he tomado la libertad de publicar un caso de prueba completo y simplificado, espero que no te importe. He visto este comportamiento también y me pregunté por qué sería. Se ve y huele como un error, pero a veces las cosas son muy sutiles, y es sorprendente que tanto FF como Chrome tengan sus * completamente * motores de JavaScript subyacentes. –
Para que quede claro, funciona siempre que no se genere el error/excepción, pero si 'alguna condición' se convierte en verdadera y se lanza la excepción, entonces la función fallará en la siguiente invocación porque el patrón continúa desde donde el excepción fue arrojado? Eso seguramente suena como un error que está fuera de tus manos. – PatrikAkerstrand