Я только что обнаружил самую странную ошибку в некотором коде javascript, касающемся RegExp.test
. У меня было регулярное выражение regexp
, объявленное внутри функции, и у меня было замыкание со ссылкой на regexp
, и я использовал замыкание для перебора массива строк, чтобы проверить их с помощью collect
из прототипа .js, то есть
function some_func() {
var regexp = /regular_expression/;
an_array_of_strings.collect(
function(str) {
if (regexp.test(str)) {
do_something();
}
}
);
}
Действительно странной вещью было то, что вызов regexp.test(str)
внутри замыкания будет чередоваться между true
и false
на одном и том же входе. Я посмотрел на источник для RegExp.test
и не увидел ничего подозрительного, но что-то происходило, потому что как одна и та же строка может пропускать одно и то же регулярное выражение. Посмотрев еще на RegExp.test
, я в основном пришел к выводу, что переменные, объявленные в RegExp.test
, продолжают существовать между вызовами и портят последующие вызовы. Итак, вот вопрос: в чем разница между
this.a = 2;
и
var a = 2;
когда вышеприведенные операторы появляются внутри метода, вызываемого для объекта внутри замыкания, которое содержит ссылку на этот объект? Я спрашиваю, потому что ошибка исчезает, когда я перемещаю regexp.test
за пределы закрытия. Когда regexp.test
вызывается вне замыкания, он не переключается между true
и false
при каждом вызове. Я понятия не имею, почему это происходит.
Редактировать : Когда я перемещал regexp
за пределы замыкания, я забывал добавить глобальную опцию, поэтому ошибка исчезла. Спасибо Иво .