3

簡単な質問ですが、誰か説明してくれませんか?

http://jsfiddle.net/paj5c4wn/4/

// check body tagname, return bool
var check = (function ()
{
    var body = /body/gi;

    return function ( str )
    {

        return body.test( str );
    }

})();

// get body element
var body = document.body;

// display result
for ( var i = 0; i < 10; i++ )
{
    document.getElementById( 'result-' + i ).innerHTML = check( body.tagName );
}

と :

<p id="result-0" ></p>
<p id="result-1" ></p>
<p id="result-2" ></p>
...

行う :

true

false

true

false

...

どのように可能ですか?

4

1 に答える 1

6

考えられる解決策は 2 つあります。

  1. コードは常にbody変数への同じ参照を使用します。正規表現でglobalフラグと組み合わせてRegExp.prototype.test()、正規表現が一致した最後のインデックスを記録して使用し、検索を開始します。

    まず、for ループの最初の反復中に/body/gi一致し、 を生成します。次に、2 番目の関数呼び出しで、インデックス 4 から文字列の照合を開始します。したがって、文字列の末尾から開始するため、明らかに一致しない結果となり、 が返されます。文字列が以前に一致しなかったため、インデックスは 3 回目のテストでリセットされ、プロセス全体が繰り返されます。'BODY'true'BODY'false

    これに対抗するためbodyに、クロージャー内の変数を削除して、各関数呼び出しで新しい正規表現オブジェクトを作成し、それぞれの初期インデックスを 0 にすることができます。

  2. この特定の一致は 1 回だけ実行する必要があるため、global フラグ単純に削除できます。フラグがないgと、JavaScript 正規表現オブジェクトは最後のインデックスを保持しません。代わりに、インデックスは各実行後に自動的にゼロにリセットされます。

両方のオプションを組み合わせる (この場合グローバル フラグは不要なので):

// check body tagname, return bool
var check = (function ()
{
    return function ( str )
    {

        return /body/i.test( str );
    }

})();

// get body element
var body = document.body;

// display result
for ( var i = 0; i < 10; i++ )
{
    document.getElementById( 'result-' + i ).innerHTML = check( body.tagName );
}
于 2015-06-08T16:00:03.027 に答える