У меня есть этот кусок кода:JavaScript регулярное выражение буквальные сохраняется между вызовами функций
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');
}
...
}
}
Это работает, если оператор броска не выполняется. В этом случае, в следующий раз, когда я вызову функцию, вызов exec() начнется там, где он остановился, даже если я поставляю ему новое значение «text».
я могу это исправить, написав
уага шаблона = новый RegExp ('.....');
вместо этого, но я не понимаю, почему первая версия терпит неудачу. Как постоянное выражение сохраняется между вызовами функций? (Это происходит в последних версиях Firefox и Chrome.)
Редактировать Полный тест:
<!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>
Регулярное выражение продолжается «четыре», как второго вызова на FF и Chrome, а не IE7 или Opera.
Я взял на себя смелость опубликовать полный, упрощенный тестовый пример, надеюсь, что вы не против. Я тоже видел это поведение и задавался вопросом, почему это было бы. Он выглядит и пахнет ошибкой, но потом, иногда вещи очень тонкие, и удивительно, что и FF, и Chrome будут иметь свои * полностью * различные базовые Javascript-движки. –
Чтобы быть понятным, оно работает до тех пор, пока ошибка/исключение не выбрасывается, но если «какое-то условие» становится истинным и генерируется исключение, тогда функция будет терпеть неудачу при следующем вызове, потому что шаблон продолжается, исключение было брошено? Это наверняка звучит как ошибка, которая из ваших рук. – PatrikAkerstrand