function abc(regexAsParam){
xyz(regexAsParam)
}
function xyz(re){
let regexResult1 = re.test("foo bar") //true
let regexResult2 = re.test("foo bar") //false
let regexResult3 = re.test("foo bar") //true
let regexResult4 = re.test("foo bar") //false
let regexResult5 = re.test("foo bar") //true
let regexResult6 = re.test("foo bar") //false
let regexResult7 = re.test("foo bar") //true
let regexResult8 = re.test("foo bar") //false
let regexResult9 = re.test("foo bar") //true
console.log(`regexResult1:`, regexResult1);
console.log(`regexResult2:`, regexResult2);
console.log(`regexResult3:`, regexResult3);
console.log(`regexResult4:`, regexResult4);
console.log(`regexResult5:`, regexResult5);
console.log(`regexResult6:`, regexResult6);
console.log(`regexResult7:`, regexResult7);
console.log(`regexResult8:`, regexResult8);
console.log(`regexResult9:`, regexResult9);
}
abc(/foo/ig)
令我惊讶的是,我发现运行这个简单的代码导致奇怪的输出模式(true,false,true ...),即使xyz()
中的每行代码都相同!
为什么会这样?我该怎么做才能避免它?这是JavaScript中的错误吗?
我尝试在多个浏览器上运行此代码并发现不一致的结果(从未在V8中运行 - 节点/ Chrome,但有时在Safari中正常工作,具体取决于计算机,即使两台计算机具有相同的操作系统和浏览器版本)。
如果不明显,这是我的代码的极端提炼版本,足以证明错误。我花了很多时间才能确切地找到错误的位置,但正如您从示例中看到的那样,只要将正则表达式传递给javascript函数然后传递给另一个函数,或者传递给函数,就会发生错误。本身,如果函数是递归的。
注意:只有在使用
i
标志时才会出现错误 正则表达式!
顺便说一下,我注意到错误的原始函数是递归的,但是我写的这个例子中一个函数调用另一个函数可以更容易地演示错误并推理它。