2010-09-13 28 views
11

S'il vous plaît jeter un oeil au JavaScript suivant. J'en ai pris des trucs pour que vous puissiez vous concentrer sur l'essence du problème.Chrome V8 Bug? Fonction Agir différemment après avoir été appelé une 2ème fois

Vous remarquerez que j'appelle la fonction prepPath deux fois de suite, en passant exactement la même chaîne. Dans Firefox et IE8, cette fonction alerte true chaque fois (comme prévu). Mais, dans Chromium 5.0.375.127 (55887) Ubuntu 10.04, la fonction renvoie vrai la première fois, et faux le 2ème appel, malgré que l'entrée reste exactement la même! Pourquoi retourne-t-il la deuxième fois une erreur dans Chromium? Pourquoi?

+2

La seule fois où vous avez besoin du drapeau 'g' dans une expression régulière, c'est si vous voulez utiliser la même expression plus d'une fois, avec lastIndex marqué entre les utilisations. Sans le drapeau «g», votre code fonctionne comme vous le souhaitez. Si vous définissez regX.lastIndex = 0 après l'avoir défini, il renvoie également la valeur attendue. – kennebec

Répondre

14

Il y a une certaine ambiguïté dans la spécification sur le moment où les expressions rationnelles littérales doivent être réinitialisées (rappelez-vous qu'elles ont un état). Vous pouvez contourner ce problème en faisant:

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

exemple en direct: http://jsbin.com/irate

ou ceci:

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

exemple en direct: http://jsbin.com/irate/2

Je suis informé par ceux qui » Je l'ai regardé plus que moi que ce n'est pas vraiment un bug pur, mais une ambiguïté. Et ce n'est pas seulement Chrome, certaines versions d'autres navigateurs ont également eu un problème similaire.

+0

Cela a fonctionné; Je vous remercie. Inhabituel, cependant. Normalement, lorsque vous utilisez "var" avant de définir la valeur d'une variable (dans une fonction), la variable est de toute façon nouvelle et ne conserve que la portée au niveau de la fonction avec l'état zéro entre les appels. –

+0

@LonnieBest: Oh, c'est inhabituel, et ça a l'air faux, n'est-ce pas? Cela a à voir avec le littéral et quand ils sont instanciés, et il y a vraiment un argument selon lequel le littéral est instancié * une fois * et ensuite réutilisé, ce qui est étrange bien qu'il semble. C'est le seul exemple de ce comportement étrange que je connaisse, si c'est une consolation. :-) –

+1

C'est en fait la spécification qui requiert ce comportement: http://bclary.com/2004/11/07/#a-7.8.5. Il y a un bug de Chromium à ce sujet: http://code.google.com/p/chromium/issues/detail?id=2161. – lawnsea