Javascript 与x27之间的差异;变量a=2';和';这个.a=2';
我刚刚在一些处理Javascript 与x27之间的差异;变量a=2';和';这个.a=2';,javascript,closures,Javascript,Closures,我刚刚在一些处理RegExp.test的javascript代码中发现了最奇怪的错误。我在一个函数中声明了一个正则表达式regexp,我有一个引用regexp的闭包,我使用闭包迭代字符串数组,在prototype.js的collect帮助下测试它们,即 function some_func() { var regexp = /regular_expression/; an_array_of_strings.collect( function(str) { if (
RegExp.test
的javascript代码中发现了最奇怪的错误。我在一个函数中声明了一个正则表达式regexp
,我有一个引用regexp
的闭包,我使用闭包迭代字符串数组,在prototype.js的collect
帮助下测试它们,即
function some_func() {
var regexp = /regular_expression/;
an_array_of_strings.collect(
function(str) {
if (regexp.test(str)) {
do_something();
}
}
);
}
真正奇怪的是,在闭包内调用regexp.test(str)
会在相同输入上的true
和false
之间交替进行。我查看了RegExp.test
的源代码,没有发现任何可疑之处,但有一些事情发生了,因为同一个字符串如何通过和失败同一个正则表达式。在进一步研究了RegExp.test
之后,我基本上得出结论,在RegExp.test
中声明的变量在调用之间仍然存在,并且正在扰乱后续调用。所以问题是:两者之间有什么区别
this.a = 2;
及
当上述语句出现在一个方法中时,该方法是在一个包含对该对象的引用的闭包中对一个对象调用的?我这样问是因为当我将regexp.test
移到闭包之外时,bug就会消失。当在闭包外部调用regexp.test
时,它不会在每次调用时在true
和false
之间切换。我不知道为什么会这样
Edit:当我将
regexp
移到闭包之外时,我忘记了添加全局选项,这就是bug消失的原因。谢谢。这是一个棘手的问题,因为乍一看它们似乎是一样的
我猜想
this.a
由函数拥有,但也可能会延长该函数的生命周期,而不仅仅是函数调用本身;而var a
将在每次执行函数时创建和销毁。看看JS中这个
的奇妙之处。这个
的含义变化很大,这取决于您如何使用函数。由于您没有显示RegExp,但我只是回答了类似的问题,我想您在RegExp中使用了全局
选项,这有一些有趣的副作用
与exec一样(或与exec结合使用)
它)在上多次调用测试
同一全局正则表达式
实例将通过
上一场比赛
资料来源:
因此,这里的实际情况是,由于您对正则表达式使用了全局选项,因此它将在找到匹配项后继续搜索字符串
regexp.test("d")
这将在位置0处找到d
regexp.test("d")
现在,它将从位置1开始搜索d,但由于这是字符串的结尾,因此不会找到任何返回值false的内容
regexp.test("d")
我们可以使用正则表达式的lastIndex
属性来证明:
regexp.lastIndex
>> 0
regexp.test("d")
>> true
regexp.lastIndex
>> 1
regexp.test("d")
>> false
因此,要解决这个问题,您需要从RegExp中删除global
选项
免责声明,这是我先前回答的副本:Ah但当函数作为方法调用时,应该一点也不困难。当像在
regexp.test(str)
中那样作为方法调用时,this
应该没有歧义,因为它引用了regexp
,我猜您的函数do_something()和闭包都属于窗口。您可能会包含一些愚蠢的调试代码,类似于console.debug(this)或console.debug(this.getAttribute('id'))。就js执行而言,它至少可以提供关于这是什么的线索。这个答案的意义是什么?这与var
和this
有什么关系?在他的问题中没有var
和this
,他在猜测RegExp.test
的内部,我肯定里面没有这个.a
,因为它是本机C代码。哦,天哪,我怎么会错过它。你说得对。这就是正在发生的事情。问题不在于关闭,而在于全局选项。