потому что асинхронность. функция, переданная в setTimeout выполнится уже после цикла (а точнее в новом таске, когда браузер уже обработает UI события и прочую свою хрень), уже после того как цикл закончится, а i к этому времени станет как раз 10.
Обсуждают сегодня