本文探讨 JavaScript 中正则表达式 lastIndex 属性在函数内部重复声明时的行为。通过代码示例发现,尽管在函数内重新声明了带有全局标志(g)的正则表达式,但其 lastIndex 属性似乎保留了上一次调用的状态。文章分析了这一现象背后的机制,指出这通常与正则表达式对象的复用或引擎内部状态管理有关,而非简单的变量作用域问题。
代码示例与预期差异
观察以下代码片段:
function test(s){
var reg = /./g;
console.log(reg.exec(s));
console.log(reg.lastIndex);
var reg = /./g;
console.log(reg.exec(s));
console.log(reg.lastIndex);
}
test("abcd");
test("efgh");
实际输出结果分析
预期中,每次调用时 lastIndex 的值都应为 1,但实际输出结果如下:
a
1
a
1
f
2
f
2
现象解释与疑问
这种现象让人联想到,在第二次调用 test 函数时,第 2 行和第 6 行的正则表达式声明似乎并未创建全新的实例,而是复用了之前的对象,导致 lastIndex 属性(值为 1)得以保留。这一行为与常规的变量作用域预期不符,令人困惑。