Замыкания внутри циклов javascript
1. Если как они утверждают цикл будет закончен до того как будет вызвана console.log(i) то почему результат выводится 10 раз?
У вас же timeout используется, т.е. 10 раз внутри цикла будет запущен таймер, пока первый из таймеров закончится цикл уже пройдет все 10 итераций и соотв i будет иметь значение 10.
Сначала цикл будет закончен, следовательно 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);  
    };
 }
Всё вместе называется асинхронное выполнение.