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 сейчас
  };
}