Показать сообщение отдельно
  #5 (permalink)  
Старый 08.12.2008, 19:02
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Дело даже не в осле - если есть глобальный флаг, смещение до начала следующего поиска хранится в самом объекте регэкспа. А поскольку в замыкании он используется один и тот же, это смещение всякий раз остается таким, каким оно стало в предыдущем вызове функции.
Если прогнать небольшой тест:
(function() {
	var re = /\S+/g;
	return function(a) {
		var _ = re.exec(a);
		if (_) alert('"' + a + '" matches: "' + _[0] + '"');
		else alert('"' + a + '" not matched');
		return arguments.callee;
	}
})()('aaa bbb ccc')('000 111 222')('--- +++ ===')('zzz xxx yyy');

То станет ясно, что поиск каждый раз продолжается с той позиции, где был завершен предыдущий. При этом, когда встречается конец строки, регэксп фэйлит совпадение, а следующее уже начинает опять с начала. Но различие между ослом и лисой все-таки есть: в случае
function() {
  var re = /.../g;
}

осел создаст новый инстанс регэкспа, а хитрая лиса - использует имеющийся, видимо экономит на компиляции.

Последний раз редактировалось vk65535, 08.12.2008 в 19:07.
Ответить с цитированием