Функции используются при написании программ для выполнения объемного кода повторно в нескольких местах.

// Общий вид невозвращающей функции
function имя_функции(аргументы) {
    // Тут выполняем действия
    ...
}
 
// Общий вид возвращающей функции
function имя_функции(аргументы) {
    // Тут тоже выполняем действия
    ...
    return переменная_или_значение
}

Представим, что есть действие, которое имеет большое количество кода и нужно его иногда повторять. Мы можем его можно перенести в функцию и вызывать эту функцию в нужный момент (сократить код). Как пример, запрос пароля пользователя:

let passwdsList = ["12345", "67890", "24680", "13579"];
 
function promptPassword() {
    let passwd = prompt("Ваш пароль");
 
    // Проверяем, есть ли в списке пароль
    for (let i=0; i<passwdsList.length; i++) {
        // passwdsList.length - количество элементов в списке
 
        if (passwd == passwdsList[i]) {
            alert("Доступ разрешен!");
            return passwd;  // Возвращаем введеный пароль
        }
    }
}

Можно вызывать функцию внутри себя, что называется рекурсией. Рекурсия ограничена по количеству вызовов (количество этих вызовов - глубина рекурсии). Подробнее про рекурсию

Простой пример рекурсии:

/* 
 * Да, признаю, код не имеет смысловой нагрузки, он просто показывает
 * возможность рекурчивного выполнения кода
 */
 
function getPassword() {
    let passwd = prompt("Ваш пароль");
 
    if (passwd == "abcdef") {
        alert("Доступ разрешен!");
    } else {
        getPassword();  // Повторяем запрос пароля, возможно пользователь ошибся
    }
}