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);

私の2つのFirefoxバージョンでは、これは40x foo、1x null、41xfooを返し、それ以降は、呼び出しごとにこれら2つを交換します。

これに遭遇したことがありますか?

4

3 に答える 3

2

jfriend00が言うように、これはFirefoxのJSエンジンのバグです。Firefox12で修正する必要があり ます。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 に答える