为什么只有在局部 doCount 函数之前声明函数作用域变量时正则表达式才起作用

Why is regex working only if function scoped variable is declared before the local doCount function

我在下面有一些示例代码 link: working sample.

var a = "sd 1234 abc \n";

function removeNewLineCharacter1() {
  doCount(a);

  var _trimNewLineCharsRegExp = /(^[\n\r]+)|([\n\r]+$)/g;

  function doCount(g) {
    var originalLength = g.length;
    g = g.replace(_trimNewLineCharsRegExp, "");
    console.log("original length :" + originalLength + " and final length : " + g.length);
  }
}

function removeNewLineCharacter2() {
  var _trimNewLineCharsRegExp = /(^[\n\r]+)|([\n\r]+$)/g;

  doCount(a);

  function doCount(g) {
    var originalLength = g.length;
    g = g.replace(_trimNewLineCharsRegExp, "");
    console.log("original length :" + originalLength + " and final length : " + g.length);
  }
}
<button id="btn1" onclick="removeNewLineCharacter1(); return false;">Remove new line character(s) 1</button>
<button id="btn1" onclick="removeNewLineCharacter2(); return false;">Remove new line character(s) 2</button>

当我单击显示 Remove new line character(s) 1 的按钮时,新行字符不会从字符串 a 中删除。但是,当我单击显示 Remove new line character(s) 2 的按钮时,换行符将被删除。单击这两个按钮时都会调用不同的函数,但这些被调用函数之间的区别仅仅是正则表达式变量 _trimNewLineCharsRegExp 在被调用函数中的 doCount 局部作用域函数之前声明。

问题

为什么第一个按钮的 onclick 函数没有删除换行符?

var声明的变量被提升,所以什么时候声明没有关系。

这里的关键是赋值

在第一个例子中,它是undefined,然后你调用函数(将undefined传递给g.replace),然后你给它一个值。

在第二个例子中,你在调用函数之前给它一个值(所以你将 /(^[\n\r]+)|([\n\r]+$)/g 传递给 g.replace)。

var 定义的变量被提升。这意味着声明被移动到函数的顶部。但是他们得到 initialized 你给他们赋值的地方。

在您的情况下,在一个实例中您在调用 doCount 之前初始化变量,在另一个实例之后初始化变量。

这意味着在 removeNewLineCharacter1doCount_trimNewLineCharsRegExp 的未定义值执行。这就是差异的来源。