Почему переменная объявленная в цикле сохраняется и за его пределами?
а с каких пор цикл стал функцией?
ты обьявляешь i глобально - а потом также вызываешь ее глобально.
Вот вам пример того, что происходит на самом деле:function doSmth()
{
  var i; // будучи определенной через var, i объявляется за пределом блока for.
  for (i = 0; i < 10; i++)
     document.write(i);
alert(i); 
}
Чтоб такого не получалось, делайте иначе:for (let i = 0; i < 10; i++)
 document.write(i);
alert(i); // будет ошибка undefined