Javascript 正则表达式文本生成的RegExp对象共享一个实例? 第07章 函数make_a_matcher(){ 返回/a/gi; } var x=使匹配器匹配(); var y=使匹配器匹配(); x、 lastIndex=10; document.writeln('x.global:'+x.global+''); document.writeln('x.ignoreCase:'+x.ignoreCase+''); document.writeln('x.lastIndex:'+x.lastIndex+''); document.writeln('x.multiline:'+x.multiline+''); document.writeln('x.source:'+x.source+''); document.writeln('y.global:'+y.global+''); 书面文件('y.ignoreCase:'+y.ignoreCase+''); document.writeln('y.lastIndex:'+y.lastIndex+''); document.writeln('y.multiline:'+y.multiline+''); document.writeln('y.source:'+y.source+'');

Javascript 正则表达式文本生成的RegExp对象共享一个实例? 第07章 函数make_a_matcher(){ 返回/a/gi; } var x=使匹配器匹配(); var y=使匹配器匹配(); x、 lastIndex=10; document.writeln('x.global:'+x.global+''); document.writeln('x.ignoreCase:'+x.ignoreCase+''); document.writeln('x.lastIndex:'+x.lastIndex+''); document.writeln('x.multiline:'+x.multiline+''); document.writeln('x.source:'+x.source+''); document.writeln('y.global:'+y.global+''); 书面文件('y.ignoreCase:'+y.ignoreCase+''); document.writeln('y.lastIndex:'+y.lastIndex+''); document.writeln('y.multiline:'+y.multiline+''); document.writeln('y.source:'+y.source+'');,javascript,regex,Javascript,Regex,我正在学习Douglas Crockford写的“JavaScript的好部分”。 他描述了由正则表达式文本生成的RegExp对象共享一个实例和上面的示例 书中的结果是y.lastIndex:10。但是我的结果是y.lastIndex:0 如果您能告诉我这个不同结果的确切原因,我将不胜感激。Crockford的信息不正确(或不是最新的),任何简单的测试都将验证您每次调用函数时都会得到一个新的、不同的对象 如果希望它们返回相同的对象,可以执行以下操作: <!DOCTYPE html>

我正在学习Douglas Crockford写的“JavaScript的好部分”。 他描述了由正则表达式文本生成的RegExp对象共享一个实例和上面的示例

书中的结果是
y.lastIndex:10
。但是我的结果是
y.lastIndex:0


如果您能告诉我这个不同结果的确切原因,我将不胜感激。

Crockford的信息不正确(或不是最新的),任何简单的测试都将验证您每次调用函数时都会得到一个新的、不同的对象

如果希望它们返回相同的对象,可以执行以下操作:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <title>chap07</title>
    <script>
    function make_a_matcher(){
        return /a/gi;
    }

    var x = make_a_matcher();
    var y = make_a_matcher();

    x.lastIndex = 10;

    document.writeln('<div>x.global : '+x.global+'<div>');
    document.writeln('<div>x.ignoreCase : '+x.ignoreCase+'<div>');
    document.writeln('<div>x.lastIndex : '+x.lastIndex+'<div>');
    document.writeln('<div>x.multiline : '+x.multiline+'<div>');
    document.writeln('<div>x.source : '+x.source+'<div>');

    document.writeln('<div>y.global : '+y.global+'<div>');
    document.writeln('<div>y.ignoreCase : '+y.ignoreCase+'<div>');
    document.writeln('<div>y.lastIndex : '+y.lastIndex+'<div>');
    document.writeln('<div>y.multiline : '+y.multiline+'<div>');
    document.writeln('<div>y.source : '+y.source+'<div>');
    </script>
</head>
<body>
</body>
</html>
演示:

请参阅及其答案。特别是其中一个答案引用了规范§7.8.5正则表达式文字,其中规定:

正则表达式文本是一个输入元素,每次计算该文本时,它都会转换为RegExp对象(请参见15.10)

因此,每次调用函数make_a_matcher时,都会创建一个新的regexp对象。如果Crockford先生的书不是这样说的话,它可能已经过时了。

当你这样做的时候

var make_a_matcher = (function() {
    var regex = /a/gi;
    return function() {
        return regex;
    }
})();
您正在创建单独的实例。这与:

function make_a_matcher(){
  return /a/gi;
}

var x = make_a_matcher();
var y = make_a_matcher();
如果在创建
make_a_matcher()
之前创建实例,它应该可以工作

function make_a_matcher(){
  return new RegExp('a', 'gi');
}

虽然没有必要,因为您可以直接使用该变量。

在我的计算机中,y也等于0; 因为make_a_matcher函数返回一个名为RegExp对象的对象,而x,y是RegExp对象的不同实例,这意味着x,y是分开的

var agi = /a/gi;
function make_a_matcher(){
  return agi;
}

在下图中,我们可以看到x,y是RegExp的不同实例,但并不相等。

我认为Crockford的信息已经过时了。在现代浏览器中,您将获得单独的实例。(试试console.log(x==y))你确定他说的不是
RegExp
函数对象,它确实有一些在所有regex实例之间共享的属性吗?
function make_a_matcher() {
return /a/gi;
}
var x = make_a_matcher();
var y = make_a_matcher();
x.lastIndex = 10;
console.log(y.lastIndex);