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

有两种可能的解决方案:

  1. 您的代码始终使用对body变量的相同引用。结合正则表达式中的全局标志,记录RegExp.prototype.test()并使用正则表达式匹配的最后一个索引开始搜索。

    首先,在 for 循环的第一次迭代期间/body/gi匹配,产生. 然后,在第二个函数调用中,它从索引 4 开始匹配字符串。因此,它从字符串的末尾开始,因此显然不匹配,返回. 然后索引在第三次测试中被重置,因为字符串以前不匹配并且整个过程重复。'BODY'true'BODY'false

    为了解决这个问题,您可以删除body闭包中的变量,以允许在每次函数调用时创建一个新的正则表达式对象,每个函数的初始索引为 0。

  2. 您可以简单地删除全局标志,因为这个特定的匹配只需要执行一次。如果没有该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 回答