Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 与x27之间的差异;变量a=2';和';这个.a=2';_Javascript_Closures - Fatal编程技术网

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代码。哦,天哪,我怎么会错过它。你说得对。这就是正在发生的事情。问题不在于关闭,而在于全局选项。