带有元素标签名的regexp错误
bug regexp with element tagname?
简单的问题,谁能给我解释一下?
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
...
怎么可能?
有两种可能的解决方案:
-
您的代码总是使用对
body
变量的相同引用。结合正则表达式中的g全局标志,RegExp.prototype.test()
记录并使用regex匹配的最后一个索引开始搜索。首先,在for循环的第一次迭代中,
/body/gi
匹配'BODY'
,得到true
。然后,在第二次函数调用时,它开始匹配索引4中的字符串。因此,它从'BODY'
字符串的末尾开始,因此显然没有匹配结果,返回false
。然后在第三次测试时,索引被重置,因为字符串之前没有匹配,整个过程重复。为了解决这个问题,您可以删除闭包中的
body
变量,以允许在每个函数调用时创建一个新的正则表达式对象,每个函数调用的初始索引为0。 -
您可以简单地删除g全局标志,因为这个特定的匹配只需要执行一次。如果没有
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 );
}
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 我如何修复包含在captcha的addthis中的错误
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- JavaScript 中的 RegExp 在进行全局搜索时出现错误
- JavaScript中的RegExp在PHP中引发错误
- 为什么我得到错误,而测试regexp
- 错误:无效的量词- JavaScript中的RegExp
- Javascript regexp创建错误
- TypeScript编译错误-无法选择重载'call'表达式——RegExp.test
- RegExp JavaScript错误测试
- RegExp在ng-class内部引发错误
- Firefox在JavaScript中使用regexp替换字符串时出现错误
- 带有元素标签名的regexp错误
- JavaScript RegExp:为什么导致双反斜杠()错误