setTimeout(show(i), i * 300);
Вместо того, чтобы передать в setTimeout функцию, вы её вызываете.
Какие есть варианты исправить косяк:
- Оберните вызов своей функции в другую функцию, которая будет передана в setTimeout:
setTimeout(() => show(i), i * 300);
- Выполните привязку параметра:
setTimeout(show.bind(null, i), i * 300);
- Передавайте свою функцию в setTimeout, а параметры, с которыми она должны быть вызвана, укажите отдельно:
setTimeout(show, i * 300, i);
- Перепишите свою функцию так, чтобы она возвращала другую функцию:
function show(x) {
return function() {
// сюда помещаете то, что находится у вас в show сейчас
};
}