gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:31:04 25 4
gpt4 key购买 nike

我刚刚在一些处理 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) 会在同一输入上的 truefalse 之间交替.我查看了 RegExp.test 的源代码,没有发现任何可疑之处,但确实存在一些问题,因为相同的字符串如何通过相同的正则表达式并使其失败。在进一步查看 RegExp.test 之后,我基本上得出结论,在 RegExp.test 中声明的变量在两次调用之间继续存在,并扰乱了后续调用。所以问题来了:

之间有什么区别
this.a = 2;

var a = 2;

当上述语句出现在一个方法中时,该方法正在一个对象上调用,该对象位于一个包含对该对象的引用的闭包中?我问是因为当我将 regexp.test 移到闭包之外时,错误就消失了。当在闭包外调用 regexp.test 时,它不会在每次调用时在 truefalse 之间切换。我不知道为什么会这样。

编辑:当我将 regexp 移到闭包之外时,我忘记添加全局选项,这就是错误消失的原因。谢谢Ivo .

最佳答案

由于您没有显示您的 RegExp 但我只是回答了类似的问题,我想您在 RegExp 中使用了 global 选项,这会产生一些有趣的副作用。

As with exec (or in combination with it), test called multiple times on the same global regular expression instance will advance past the previous match.

来源: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!

关于javascript - 'var a = 2' 和 'this.a = 2' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com