为什么只有在局部 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
之前初始化变量,在另一个实例之后初始化变量。
这意味着在 removeNewLineCharacter1
中 doCount
以 _trimNewLineCharsRegExp
的未定义值执行。这就是差异的来源。
我在下面有一些示例代码 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
之前初始化变量,在另一个实例之后初始化变量。
这意味着在 removeNewLineCharacter1
中 doCount
以 _trimNewLineCharsRegExp
的未定义值执行。这就是差异的来源。