Задать вопрос

Обьясните как работает замыкание?

Здравствуйте!
Обьясните как в данном случаи работает замыкание, а то что-то не пойму никак
function celebrityIDCreator (theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i < theCelebrities.length; i++) {
        theCelebrities[i]["id"] = function (j)  { 
            return function () {
                return uniqueID + j; 
            } () 
        } (i); 
    }

    return theCelebrities;
}

​var actionCelebs = [
{name:"Stallone", id:0}, 
{name:"Cruise", id:0}, 
{name:"Willis", id:0}
];

celebrityIDCreator (actionCelebs )

Спасибо большое!
  • Вопрос задан
  • 2710 просмотров
Подписаться 10 Простой 2 комментария
Решения вопроса 1
theobroma
@theobroma
javascript developer (ReactJS)
Я понимаю замыкание так: "дочерняя" функция имеет доступ к переменным функции "родительской".
Другими словами переменная "uniqueID" объявлена внутри функции "celebrityIDCreator", а значит в глобальной области видимости этой переменной нет. В цикле отрабатывает анонимная функция (5 строчка в коде), она же, можно сказать , что "дочерняя". Но эта анонимная функция имеет доступ к переменной "uniqueID"! Хотя переменная и не глобальная, и не была объявлена внутри анонимной функции!
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@kttotto
пофиг на чем писать
Вы uniqueID используете внутри функции, но объявили ее за пределами видимости этой функции
function (j)  { 
            return function () {
                return uniqueID + j; 
        } () 
} (i);

это и есть замыкание.

Про замыкания хорошо здесь описано.
Ответ написан
Veliky
@Veliky
Full Stack Web Dev
В данном примере переменная actionCelebs доступна внутри celebrityIDCreator().
Подробнее о том как это работает рекомендую почитать здесь, и примеры имеются.
Ответ написан
uaKorona
@uaKorona
Front-End разработчик
Зачем замыкания и такая вложенность функций в данном конкретном случае ?

function celebrityIDCreator (theCelebrities) {    
    return theCelebrities.map((celebrity, index) => {
        celebrity.id = 100 + index;
        return celebrity;
    })
}


не ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы