'var a = 2'和'this.a = 2'之间的区别

时间:2010-11-17 13:08:47

标签: javascript closures

我刚刚发现了一些处理RegExp.test的javascript代码中最奇怪的错误。我在函数内部声明了一个正则表达式regexp,我有一个关于regexp的引用的闭包,我使用闭包来迭代一个字符串数组,以便在{的帮助下测试它们来自prototype.js的{1}},即

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;

当上述语句出现在一个闭包内的对象上调用的方法中,该闭包中包含对该对象的引用?我问,因为当我在关闭点之外移动var a = 2; 时,错误消失了。当在闭包之外调用regexp.test时,它在每次调用时都不会在regexp.testtrue之间翻转。我不知道为什么会这样。

编辑:当我在关闭之外移动false时,我忘记添加全局选项,这就是错误消失的原因。谢谢Ivo

3 个答案:

答案 0 :(得分:3)

由于你没有展示你的RegExp,但我刚刚回答了类似的问题,我想你在RegExp中使用了global选项,这有一些有趣的副作用。

  

与exec一样(或与exec结合使用)   它),测试多次调用   相同的全局正则表达式   实例将超越   上一场比赛。

来源:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test

所以这里究竟发生了什么,因为你正在使用正则表达式的全局选项,它会在找到匹配后继续搜索字符串。

regexp.test("d")

这将在位置0 找到d。

regexp.test("d")

现在将从位置1 开始搜索d,但由于这是字符串的结尾,因此无法找到任何内容,因此返回 false

我们可以使用正则表达式的lastIndex属性来证明:

regexp.lastIndex
>> 0
regexp.test("d")
>> true
regexp.lastIndex
>> 1
regexp.test("d")
>> false

因此,要解决此问题,您需要从RegExp中删除global选项。

免责声明,这是我之前回答的副本:
Unusual javascript Regex result, explanation please!

答案 1 :(得分:1)

这是一个棘手的问题,乍一看它们似乎是相同的。

我猜测this.a归该函数所有,但也可能延续该函数的生命周期,而不仅仅是函数调用本身;而每次执行函数时都会创建和销毁var a

答案 2 :(得分:1)

查看this page关于JS中this的奇迹。 this的含义变化非常大,取决于您如何使用函数。