2010-09-13 67 views
11

請看下面的JavaScript。我已經拿出了一些東西,所以你可以專注於問題的本質。Chrome V8的錯誤?功能在被稱爲第二次後起作用不同

您會注意到,我連續兩次調用prepPath函數,傳入完全相同的字符串。在firefox和IE8中,這個函數每次都會報警(如預期的那樣)。但是,在Chromium 5.0.375.127(55887)Ubuntu 10.04中,該函數第一次返回true,並且第二次調用返回false,儘管輸入保持完全相同!

<script type="text/javascript"> 
    function prepPath(str) 
    { 
     var regX = /[^\s/"'\\].*[^\s/"'\\]/g; 
     if(regX.test(str)) 
     { 
      alert("true: " + str); 
     } 
     else 
     { 
      alert("false; " + str); 
     } 
    } 

    prepPath("/desktop"); // alerts: true 
    prepPath("/desktop"); // alerts: false 
</script> 

爲什麼它在Chromium中第二次返回錯誤?

+2

在常規表達式中唯一需要'g'標誌的時間是,如果您想多次使用同一個表達式,而lastIndex標記爲兩次使用之間。如果沒有'g'標誌,你的代碼將按照你期望的方式工作。如果在定義它之後設置regX.lastIndex = 0,它也將返回期望值。 – kennebec 2010-09-13 18:47:33

回答

14

規範中有關文字正則表達式應該被重置的一些含糊之處(回想它們有狀態)。您可以變通的作法是這樣:

var regX = new RegExp(/[^\s/"'\\].*[^\s/"'\\]/g); 

活生生的例子:http://jsbin.com/irate

或本:

var regX = /[^\s/"'\\].*[^\s/"'\\]/g; 
regX.lastIndex = 0; 

活生生的例子:http://jsbin.com/irate/2

我被告知那些誰」我已經比它更深入地研究它,它實際上並不是一個徹頭徹尾的錯誤,而是一個含糊不清的問題。這不僅僅是Chrome瀏覽器,其他一些瀏覽器版本也有類似的問題。

+0

工作;謝謝。不尋常的,但。通常,在設置變量的值(在函數中)之前使用「var」時,該變量無論如何都是新變量,並且僅在調用之間保持函數級範圍爲零狀態。 – 2010-09-13 18:23:14

+0

@LonnieBest:哦,這很不尋常,它肯定看起來不對,不是嗎?它與文字有關,當它們被實例化時,確實存在一個論據,即文字被實例化*一次*然後重用,雖然看起來很奇怪。這是我知道的這種奇怪行爲的唯一例子,如果這是任何安慰。 :-) – 2010-09-13 18:28:14

+1

它實際上是需要這種行爲的規範:http://bclary.com/2004/11/07/#a-7.8.5。有關於它的Chromium錯誤:http://code.google.com/p/chromium/issues/detail?id=2161。 – lawnsea 2010-09-13 18:39:43

相關問題