Обьясните как работает замыкание?
Вы uniqueID используете внутри функции, но объявили ее за пределами видимости этой функции function (j)  { 
            return function () {
                return uniqueID + j; 
        } () 
} (i);
это и есть замыкание.
Про замыкания хорошо здесь описано.
Я понимаю замыкание так: "дочерняя" функция имеет доступ к переменным функции "родительской".
Другими словами переменная "uniqueID" объявлена внутри функции "celebrityIDCreator", а значит в глобальной области видимости этой переменной нет.  В цикле отрабатывает анонимная функция (5 строчка в коде), она же, можно сказать , что "дочерняя". Но эта анонимная функция имеет доступ  к переменной "uniqueID"! Хотя переменная и не глобальная, и не была объявлена внутри анонимной функции!