Почему цикл выводит десять раз undefined?
var i  //Создать переменную i (undefined) в данной области видимости
 = i;  //Затем присвоить ей значение переменной переменной i (которую только что создали - undefined)
И не важно - в замыкании вы так сделали или еще где. У интерпретатора такая логика, и это вполне нормально. А господа выше, почему-то валят все на самовызывающуюся функцию...один ляпнул, другие повторили.
Самый адекватный подход - не использовать одинаковые имена переменных в подобных схемах.
берется извне переменная i и присваивается переменной iТам не так, имя "i" захватывается не в момент var, а с начала блока и до конца, тот же результат будет если var i переместить в конец:for (var i = 0; i < 10; i++) {
  (function() {
      console.log(i);
      var i;
  })();
}
То же самое с именованными функциями, они создаются сразу, а не с точки где опубликованы:foo();  // вызов
function foo() {console.log('FOO') }  // объявление