2010-09-13 10 views
11

Por favor, eche un vistazo al siguiente JavaScript. Le he quitado cosas, así que puedes enfocarte en la esencia del problema.Chrome V8 Bug? Función Actuar diferente después de haber sido llamado por segunda vez

Notarás que llamo a la función prepPath dos veces seguidas, pasando exactamente la misma cadena. En Firefox e IE8, esta función alerta verdad cada vez (como se esperaba). Pero, en Chromium 5.0.375.127 (55887) Ubuntu 10.04, la función devuelve verdadero la primera vez, y la segunda llamada es falsa, a pesar de que la entrada permanece exactamente igual.

<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> 

¿Por qué está volviendo falso la segunda vez en Chromium?

+2

La única vez que necesita el indicador 'g' en una expresión regular es si desea usar la misma expresión más de una vez, con el último índice marcado entre usos. Sin la bandera 'g', su código funciona de la manera que usted esperaría. Si establece regX.lastIndex = 0 después de definirlo, también devolverá el valor esperado. – kennebec

Respuesta

14

Hay cierta ambigüedad en la especificación acerca de cuándo deben restaurarse las expresiones regulares literales (recuérdese que tienen estado). Puede evitar esto haciendo esto:

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

ejemplo vivo: http://jsbin.com/irate

o esto:

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

ejemplo vivo: http://jsbin.com/irate/2

estoy informado por quienes' he investigado más que yo que no es en realidad un error completo, sino una ambigüedad. Y no es solo Chrome, algunas versiones de otros navegadores también han tenido un problema similar.

+0

Eso funcionó; gracias. Inusual, sin embargo. Normalmente, cuando usa "var" antes de establecer el valor de una variable (en una función), la variable es nueva de todos modos y solo mantiene el alcance del nivel de función con estado cero entre llamadas. –

+0

@LonnieBest: Oh, es inusual, está bien, y ciertamente parece estar equivocado, ¿no? Tiene que ver con el literal y cuando se crean instancias, y realmente existe un argumento de que el literal se instancia * una vez * y luego se reutiliza, por extraño que parezca. Es el único ejemplo de este extraño comportamiento que conozco, si eso te sirve de consuelo. :-) –

+1

En realidad, es la especificación que requiere este comportamiento: http://bclary.com/2004/11/07/#a-7.8.5. Hay un error de Chromium al respecto: http://code.google.com/p/chromium/issues/detail?id=2161. – lawnsea

Cuestiones relacionadas