Почему если вначале подключаешь скрипт js то пишет Uncaught TypeError: slides[currentSlide] is undefined
Браузер парсит html-страницу последовательно, строка за строкой, попутно выстраивая Document Object Model, с которой умеет работать java script в браузере. Если во время обработки страницы встречается тэг скрипт, браузер сначала скачивает (если нужно), парсит и выполняет java script код, соответственно, если этот код пытается обратиться к элементам страницы, которые находятся ниже тэга script, будет получено исключение, ибо к тому моменту, когда js-код стал выполняться, браузер ещё не дошёл до места на станице, где присутствуют необходимые html-элементы. Их просто нет.
Я думаю, теперь нет надобности объяснять, почему скрипт подключённый в конце тега body, работает