Я думаю, что это утечка, потому что последовательные ссылки никогда не выпускаются. То есть первый вызов немедленно создает замыкание, ссылаясь на функцию внутри себя. Когда он снова вызывает себя, новая ссылка берется из экземпляра, созданного на первой итерации, поэтому первая никогда больше не может быть освобождена.
Вы можете довольно легко проверить эту теорию, изменив интервал на что-то очень маленькое, и посмотреть память в chrome ...
(правка) Теория, проверенная вашей скрипкой, на самом деле, я ошибаюсь, она не просочилась, по крайней мере, в Chrome. Но это не гарантия, что какой-то другой браузер (например, более старый IE) не так хорош в сборке мусора.
Но независимо от того, протекает он или нет, нет причин не использовать setInterval
.