На самом деле есть пара вещей, которые приводят к неправильному поведению вашего кода, и все они в том, как написан ваш цикл. Первая проблема - это вызов setTimeout, главным образом из-за того, что вы не передаете объект функции ему в качестве первого аргумента, и большинство людей исправят это, выполнив что-то вроде этого:
for (var i = 0; i < 10; i++) {
setTimeout(function() {
drawCircle(i, color2, color5);
}, 4000);
}
Это вызовет задержку setTimeout, как вы и ожидали, но в конечном итоге вызовет drawCircle с 10 в качестве первого аргумента 10 раз, и это потому, что каждый вызов использует одну и ту же ссылку на переменную "i". Значение i не извлекается до тех пор, пока не будет выполнен вызов ... через 4 секунды после завершения цикла, когда мне уже 10.
Чтобы обойти это, вам нужна еще одна функция:
function getDrawer(i, color2, color5) {
return function() {
drawCircle(i, color2, color5);
}
}
for (var i = 0; i < 10; i++) {
setTimeout(getDrawer(i, color2, color5), 4000);
}
Функция getDrawer (ужасное имя, пожалуйста, не используйте ее) вызывается немедленно, поэтому к значению i обращаются сразу и запоминает анонимная функция, которую возвращает getDrawer. Эта анонимная функция будет вызываться setTimeout.