为什么这会导致浏览器锁定(我假设的无限循环)

问题描述:

为什么这个声明挂起?为什么这会导致浏览器锁定(我假设的无限循环)

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

    } 
} 
+5

如果你回头看看你的问题,是否有任何问题出现在你身上?例如:**什么是'rx'?**和**什么是'text'?** ;-) – 2012-04-17 16:26:49

matched[0]总是包含整个匹配,所以内部循环可能永远不会终止。

+0

内部循环将终止正常。重复调用'exec()'将前进通过所有可能的匹配,直到没有更多的匹配,然后返回null。这是外部循环,不会终止。查看我的答案,了解为什么。 – jfriend00 2012-04-17 16:49:13

+0

我应该补充说,如果正则表达式上有“g”标志,那么内循环将终止。 – jfriend00 2012-04-17 17:28:36

很难确切地知道没有看到文本和rx的实际值,在这个循环中究竟发生了什么取决于这些内容,但有一种理论认为,带有“g”标志的.exec()方法保持从一个呼叫到下一个,以便您可以在一个循环中重复地呼叫它。为了让外层循环正常工作,必须从外层循环的一次迭代到下一次迭代保留该状态。

但是,当你使用相同的正则表达式对象并使用它来搜索内部循环中不同的东西时,该状态不会被正确保存 - 对象中的外部状态将被内部扰动循环这也是使用相同的对象。

你双环可能会工作,如果你使用独立的regex对象像这样每次循环:

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

    } 
} 

他们将需要真正独立的regex对象,相同的正则表达式对象不是引用。

此外,matched[0]包含来自外部的搜索,你已经在你的正则表达式的外环刚匹配matched[0]整场比赛,然后你问你只是用相同的正则表达式匹配的同样的事情再次匹配。为什么?你想达到什么目的?它似乎并不像内循环会做任何有用的事情。

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

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

+0

你的理论绝对正确;正则表达式存储状态,所以用一个正则表达式在目标字符串之间切换会导致奇怪的行为。查看https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec – apsillers 2012-04-17 16:47:37

+0

的底部我在想这可能是各州的问题。我正在研究一种语法主动式荧光笔,并且我需要在某些其他语法(例如, ,截至目前我只有一个while(...!= null),它只抓取进行着色。如果规则存在,我需要搜索内部以抓取“”。那有意义吗? – 2012-04-17 16:58:06

+0

@MikeDepies - 没有看到实际的正则表达式和您正在搜索的实际数据,我所能推荐的是您必须为这两个循环分别使用正则表达式对象。没有这个,如果不是所有的时候,你都会得到一个无限循环。 – jfriend00 2012-04-17 17:01:33