4

我在 Firefox 10 和 11 中使用正则表达式函数 exec() 时遇到了问题。

该函数在被大量调用时似乎表现不稳定。在正确的结果中,它也返回null了很多。从 Safari 5.1.3、Chrome 18 和上述 Firefox 版本,我只能在 Firefox 中看到问题。

我创建了一个 JSFiddle 来演示这个问题:http://jsfiddle.net/KSH3S/,来源:

var i, x = "";

for (i = 0; i < 10000; i++) {
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches + "<br>";
}

$('body').html(x);

在我的两个 Firefox 版本中,这会返回 40x foo、 1x null、 41x foo,然后每次调用都会在这两个版本之间进行交换。

你遇到过这种情况吗?

4

3 回答 3

2

就像 jfriend00 所说,这是 Firefox 中 JS 引擎中的一个错误。应该在 Firefox 12 中修复。请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=728021

于 2012-04-16T19:51:37.830 回答
1

该问题与循环内正则表达式的隐式声明有关。我的猜测是浏览器将它缓存在某个地方,或者以某种方式被它弄糊涂了。

如果您每次通过for循环显式创建一个新的正则表达式对象,那么 Firefox 就不再有这个问题:

var x = "";

for (var i=0; i<10000; i++) {
    var re = new RegExp("foo", "g");
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}

$('body').html( x );

http://jsfiddle.net/jfriend00/F49db/

而且,您显式声明正则表达式的方式并不重要,因为此方法也适用:

var x = "";

for (var i=0; i<10000; i++) {
    var re = /foo/g;
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}

$('body').html( x );
于 2012-04-16T00:28:27.143 回答
1

这只是部分解释。如果你试试这个小提琴,它似乎工作正常。那么问题或错误可能在于文字的正则表达式解析?我不确定,但循环优化是否会以不同于变量的方式处理文字。

这是小提琴代码:

var x = "";

for (var i=0; i<10000; i++) {
    var a='sdkfjfooasdknal';
    var b=/foo/g;
    var matches = b.exec(a);
    x += matches+"<br>";
}

$('body').html( x );​

更新:这是我试图将其强制退出正常循环并且问题再次出现的内容。这是小提琴http://jsfiddle.net/xXYdF/

var x = "";
i=200;
function reg(){
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches+"<br>";
}
    function run(){
  setTimeout(function(){
    if(i--){
      reg();
      run();
      $('body').html( x );
    }
  },10);
}

run();
于 2012-04-16T00:29:20.793 回答