来自不同范围的正则表达式作为参数传递给函数表现得很奇怪......

时间:2017-11-28 13:19:15

标签: javascript regex function scope v8

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标志时才会出现错误   正则表达式!

顺便说一下,我注意到错误的原始函数是递归的,但是我写的这个例子中一个函数调用另一个函数可以更容易地演示错误并推理它。

0 个答案:

没有答案