Je viens de découvrir le bug le plus étrange dans un code javascript traitant de RegExp.test
. J'ai eu une expression régulière regexp
déclarée à l'intérieur d'une fonction et j'avais une fermeture qui avait une référence à regexp
et j'utilisais la fermeture pour itérer sur un tableau de chaînes pour les tester à l'aide de collect
de prototype.js, soitdifférence entre 'var a = 2' et 'this.a = 2'
function some_func() {
var regexp = /regular_expression/;
an_array_of_strings.collect(
function(str) {
if (regexp.test(str)) {
do_something();
}
}
);
}
la chose vraiment bizarre était que l'appel regexp.test(str)
à l'intérieur de la fermeture alternait entre true
et false
sur la même entrée. J'ai regardé la source pour RegExp.test
et je n'ai rien vu de poisson mais il se passait quelque chose parce que la même chaîne peut passer et échouer la même expression régulière. Après avoir regardé un peu plus à RegExp.test
j'ai fondamentalement conclu que les variables déclarées dans RegExp.test
continuaient d'exister entre les invocations et gâchaient les invocations ultérieures. Alors, voici la question: Quelle est la différence entre
this.a = 2;
et
var a = 2;
lorsque les déclarations ci-dessus apparaissent à l'intérieur d'une méthode appelée sur un objet à l'intérieur d'une fermeture qui contient une référence à cet objet? Je demande parce que le bug disparaît quand je me déplace regexp.test
en dehors de la fermeture. Lorsque regexp.test
est appelé en dehors de la fermeture alors il ne bascule pas entre true
et false
à chaque appel. Je n'ai aucune idée de pourquoi cela se passe.
Modifier: Quand je bougeais la regexp
en dehors de la fermeture, j'oubliais d'ajouter l'option globale de sorte que est la raison pour laquelle le bug a été en train de disparaître. Merci Ivo.
Quel est le point de cette réponse? Qu'est-ce que cela a à voir avec 'var' et' this'? – Gumbo
Il n'y a pas 'var' et' this' dans sa question, il spécule sur les internes de 'RegExp.test' dont je suis sûr qu'il n'y a pas de' this.a' dedans, puisqu'il s'agit d'un code C natif. –
Oh mec comment diable ai-je manqué ça. Tu as raison. C'est exactement ce qui se passe. Le problème n'est pas dû à la fermeture, mais à l'option globale. – davidk01