我在这里举个例子:
var reg = /s+/g;
function testfn() {
// reg = /s+/g;
var res = reg.test('mike ross');
var showEle = document.querySelector("#show");
showEle.innerHTML = res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>
因为您可以单击该按钮,并且会发现在以下情况下有不同的结果你一次又一次地点击。
但是在内部函数中定义了正则表达式(注释内部的行),然后你发现它像以前一样工作。
为什么???
使用 g
标志的正则表达式对象具有状态,以便您可以遍历字符串中的所有匹配项。当您再次使用同一对象时,它会从上次中断的位置继续。当您每次创建一个新函数(通过在函数中创建它)时,它每次都从头开始。
状态位于 lastIndex
属性中,该属性(尽管名称)表示下次从何处开始匹配。下面是重用同一全局对象的示例,并在每个操作后显示lastIndex
:
var reg = /s+/g;
function testfn() {
var str = "Matching starting at " + reg.lastIndex;
var res = reg.test('mike ross');
var showEle = document.querySelector("#show");
showEle.innerHTML = str += ", res = " + res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>
Vs. 每次创建一个新对象:
function testfn() {
var reg = /s+/g;
var str = "Matching starting at " + reg.lastIndex;
var res = reg.test('mike ross');
var showEle = document.querySelector("#show");
showEle.innerHTML = str += ", res = " + res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>
这是因为g
修饰符。这个修饰符使正则表达式记住它上次匹配的位置,每次你使用它时,它都会寻找之后的下一个匹配项。
使用全局变量时,只有一个RegExp
对象,它会记住它在对函数的所有调用中的位置。
使用局部变量,每次调用函数时都会重新创建RegExp
对象,因此它从字符串的开头开始查找。