Сначала цикл будет закончен, следовательно i выставлено в 10, а потом через 1 секунду вызовется 10 раз функция из замыкания в setTimeout (почти сразу, с разницей ~4мс), после того как последняя из этих функций выйдет область видимости, в которой находится цикл будет отдана на съедение уборщику мусора, до того все ссылки на переменные заданные в области видимости цикла будут считаться нужными.
Обход обычно делается примерно так:
for(var i = 0; i < 10; i++) {setTimeout(LogMe(i), //получим функцию
1000*(i+1));} //видимо хочется не всё сразу через 1 секунду выполнить,
// а по одному разу за 1 секунду (последний console.log() через 10 секунд)
function LogMe(i){ //т.к. i объявлена здесь (в аргументе это всё равно что объявление var),
//то она больше не будет ссылкой на i из цикла
//эта области видимости отправится к мусорщику сразу после выполнения следующей функции
return function() { //вернем новую функцию со своей областью видимости.
console.log(i);
};
}
Всё вместе называется асинхронное выполнение.