Дело даже не в осле - если есть глобальный флаг, смещение до начала следующего поиска хранится в самом объекте регэкспа. А поскольку в замыкании он используется один и тот же, это смещение всякий раз остается таким, каким оно стало в предыдущем вызове функции.
Если прогнать небольшой тест:
(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;
}
осел создаст новый инстанс регэкспа, а хитрая лиса - использует имеющийся, видимо экономит на компиляции.