gpt4 book ai didi

javascript - 为什么这会导致浏览器锁定(我认为是无限循环)

转载 作者:行者123 更新时间:2023-11-30 08:59:48 25 4
gpt4 key购买 nike

为什么这个语句挂了?

while ((matched = rx.exec(text)) != null) {
while((m = rx.exec(matched[0])) != null) {

}
}

最佳答案

在没有看到 text 和 rx 的实际值的情况下很难确定,这个循环中实际发生的事情取决于它们的内容,但一种理论是 .exec() 方法使用“g”标志可以精确地保持从一个调用到下一个调用的状态,以便您可以在一个循环中重复调用它。为了使外循环正常工作,必须从外循环的一次迭代到下一次迭代都保留该状态。

但是,当您采用相同的正则表达式对象并使用它在内部循环中搜索不同的东西时,该状态将不会被正确保留 - rx 对象中的外部状态正在发生被同样使用相同 rx 对象的内部循环打扰。

如果您像这样为每个循环使用单独的正则表达式对象,您的双循环可能会起作用:

while ((matched = rx1.exec(text)) != null) {
while((m = rx2.exec(matched[0])) != null) {

}
}

它们需要是真正独立的正则表达式对象,而不是对同一个正则表达式对象的引用。

此外,matched[0] 包含来自外部搜索的整个匹配项,因此您刚刚将外部循环中的 matched[0] 与您的正则表达式匹配,并且然后你要求再次匹配你刚刚用相同的正则表达式匹配的完全相同的东西。为什么?你想达到什么目的?内部循环似乎不会做任何有用的事情。

与此处关于 SO 的许多问题一样,如果您备份并告诉我们您真正想要完成的事情,我们可能会提供更多有用的信息来实际解决您的实际问题。

无论如何,我的前三段解释了为什么这很容易成为无限循环。

关于javascript - 为什么这会导致浏览器锁定(我认为是无限循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10195160/

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