【发布时间】:2010-11-17 13:08:47
【问题描述】:
我刚刚在处理RegExp.test 的一些javascript 代码中发现了一个最奇怪的错误。我在函数内部声明了一个正则表达式regexp,并且我有一个引用regexp 的闭包,我使用闭包在原型的collect 的帮助下迭代字符串数组以测试它们.js,即
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.test 在闭包外被调用时,它不会在每次调用时在true 和false 之间翻转。我不知道为什么会这样。
编辑:当我将regexp 移动到闭包之外时,我忘记添加全局选项,这就是错误消失的原因。谢谢Ivo。
【问题讨论】:
标签: javascript closures