我在Firefox 10和11中使用regex函数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
,然后在每次调用时都会在这两个版本之间切换。
你遇到过这个吗?
答案 0 :(得分:2)
这是Firefox中JS引擎的一个错误,就像jfriend00说的那样。应在Firefox 12中修复。请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=728021
答案 1 :(得分: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 );
答案 2 :(得分:1)
这只是部分解释。如果您尝试this fiddle,它似乎工作正常。那么问题或错误可能在正则表达式解析文字?我不确定,但它可能是循环优化以不同于变量处理文字的东西。
这是小提琴代码:
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();