JavaScript正则表达式文字在函数调用之间持续存在

Cha*_*son 6 javascript regex

我有这段代码:

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');
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,除非执行throw语句.在这种情况下,下次调用该函数时,exec()调用从它停止的地方开始,即使我为它提供了一个新的'text'值.

我可以通过写作解决它

var pattern = new 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>
Run Code Online (Sandbox Code Playgroud)

从FF和Chrome第二次调用开始,正则表达式继续为'4',而不是IE7或Opera.

Ala*_*ore 7

通过正则表达式文字创建的RegExp对象将被缓存,但new RegExp始终会创建一个新对象.缓存的对象也保存它们的状态,但是管理该方面的规则显然不是很清楚.Steve Levithan在这篇博文中谈到了这一点(靠近底部).