为什么这会导致浏览器锁定(我假设的无限循环)
问题描述:
为什么这个声明挂起?为什么这会导致浏览器锁定(我假设的无限循环)
while ((matched = rx.exec(text)) != null) {
while((m = rx.exec(matched[0])) != null) {
}
}
答
很难确切地知道没有看到文本和rx的实际值,在这个循环中究竟发生了什么取决于这些内容,但有一种理论认为,带有“g”标志的.exec()
方法保持从一个呼叫到下一个,以便您可以在一个循环中重复地呼叫它。为了让外层循环正常工作,必须从外层循环的一次迭代到下一次迭代保留该状态。
但是,当你使用相同的正则表达式对象并使用它来搜索内部循环中不同的东西时,该状态不会被正确保存 - 对象中的外部状态将被内部扰动循环这也是使用相同的对象。
你双环可能会工作,如果你使用独立的regex对象像这样每次循环:
while ((matched = rx1.exec(text)) != null) {
while((m = rx2.exec(matched[0])) != null) {
}
}
他们将需要真正独立的regex对象,相同的正则表达式对象不是引用。
此外,matched[0]
包含来自外部的搜索,你已经在你的正则表达式的外环刚匹配matched[0]
整场比赛,然后你问你只是用相同的正则表达式匹配的同样的事情再次匹配。为什么?你想达到什么目的?它似乎并不像内循环会做任何有用的事情。
正如许多关于SO的问题一样,如果您备份并告诉我们您真正想要完成的任务,我们可能会提供更多有用的信息来真正解决您的实际问题。
无论如何,我的前三段解释了为什么这很容易成为一个无限循环。
如果你回头看看你的问题,是否有任何问题出现在你身上?例如:**什么是'rx'?**和**什么是'text'?** ;-) – 2012-04-17 16:26:49