爲什麼這個聲明掛起?爲什麼這會導致瀏覽器鎖定(我假設的無限循環)
while ((matched = rx.exec(text)) != null) {
while((m = rx.exec(matched[0])) != null) {
}
}
爲什麼這個聲明掛起?爲什麼這會導致瀏覽器鎖定(我假設的無限循環)
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