Уроки Javascript #4. Что такое замыкания в JS (простыми словами + 3 примера)

Поделиться
HTML-код
  • Опубликовано: 27 фев 2021
  • Мой Telegram: t.me/stackdevru
    В этом видео мы разберемся, что такое замыкания (Closures) в JavaScript и как они работают. Рассмотрим 3 примера использования замыканий.
    Замыкания это одна из фундаментальных концепций JavaScript, которая сбивает с толку многих начинающих разработчиков JS.
    Замыкание это функция у которой есть доступ к своей внешней функции по области видимости, даже после того, как внешняя функция прекратилась.
    Мои Курсы:
    Gatsby JS (полный курс): gatsbyjs.ru
    React для начинающих: react001.ru
    ​Все мои курсы (+ исходные файлы): stackdev.ru
    Подписывайся на соц сети:
    Telegram: t.me/stackdevru
    VK: vasilymur
    Instagram: / vm_online
    Мой блог о веб-разработке: stackdev.blog

Комментарии • 128

  • @kirill-petrov
    @kirill-petrov 3 года назад +40

    Я не встречал ещё более доступного и короткого объяснения

    • @stackdev
      @stackdev  3 года назад +2

      Спасибо!

  • @user-je7lw5ey9n
    @user-je7lw5ey9n 4 месяца назад +2

    Это магия! 12 минут меня отделяло от того, чтобы непонятное заклинание в начале видео, стало абсолютно понятным и логичным в конце

  • @SergioDev001
    @SergioDev001 Год назад +4

    На втором примере стало понятно 50 на 50. И тут Василий выкатывает 3-ий пример, после которого, у меня все встает на свои места. Спасибо!

  • @munarcymbatov181
    @munarcymbatov181 3 года назад +17

    Очень понятно и интересно и ещё ждём от вас REDUX👍👍👍

  • @mar_kha
    @mar_kha Год назад +4

    Спасибо вам большое! 🤗
    Сегодня был экзамен "Программирование на JS", и в качестве доп вопроса спросили "Что знаешь про замыкание?"
    Ответила то, что сегодня утром, пока ехала в автобусе, просмотрела
    Поставили "5")

    • @stackdev
      @stackdev  Год назад +1

      Круто) поздравляю

  • @flashback8504
    @flashback8504 2 года назад +7

    Благодаря этому видео реально понял замыкания! Большое Спасибо!!!

    • @stackdev
      @stackdev  2 года назад +1

      Рад что вам было полезно:)

  • @user-mb7kp1bl4w
    @user-mb7kp1bl4w 3 года назад +7

    Автору большое спасибо за труд! Очень доступно

  • @user-cd1sr5sx2r
    @user-cd1sr5sx2r 3 года назад +7

    Спасибо! Хорошие примеры для объяснения замыкания.

  • @Andrei-nr2oi
    @Andrei-nr2oi 3 года назад +7

    Спасибо. Максимум полезной информации!

  • @azamatmyktybekov6194
    @azamatmyktybekov6194 Год назад +2

    СПС ОГРОМНОЕ я час не мог понять что такое замыкание и вдруг наткнулся на ваше видео и за 12 мин понял

  • @AlexanderShinigami
    @AlexanderShinigami 2 года назад +2

    Круто! Спасибо большое! Чем больше учу язык тем больше понимаю важность хороших, понятных и разных примеров

  • @sergdonskikh2140
    @sergdonskikh2140 3 года назад +2

    Вы замечательно все рассказываете , побольше таких уроков !

  • @elenasmirnova3549
    @elenasmirnova3549 11 месяцев назад +1

    спасибо, Вася!

  • @Lok1goD
    @Lok1goD 2 года назад +2

    Спасибо! Очень понятные примеры и объяснение на высоте, продолжай!

  • @voodooshtv7883
    @voodooshtv7883 Год назад +1

    Понятное видео, спасибо

  • @Albert_Hall
    @Albert_Hall 2 года назад +2

    Очень приятная подача и хорошие примеры! Благодарю!

  • @kinomir20
    @kinomir20 Год назад +1

    Отличные уроки, спасибо!

  • @petelazari7994
    @petelazari7994 2 года назад +2

    prikolinii i svejii content, vsem budu recomandavati!!

    • @stackdev
      @stackdev  2 года назад

      Спасибо за поддержку!

  • @user-zb1sg8ov3h
    @user-zb1sg8ov3h Год назад +1

    Предполагаю, что если писать по старокрестьянски с использованием ООП - то будет примерно вот так:
    class Player {
    score = 0
    countScore() {
    return this.score++
    }
    }
    const pl1 = new Player()
    const pl2 = new Player()
    ///И в консоли
    const pl1 = new Player()
    const pl2 = new Player()
    pl1.countScore() // ->0
    pl1.countScore() // ->1
    pl1.countScore() // ->2
    pl2.countScore() // ->0
    pl2.countScore() // ->1
    pl2.countScore() // ->2
    Что примерно является эквивалентом последнего примера.

  • @yaropolkvass6131
    @yaropolkvass6131 Год назад +1

    Господи спасибо Вам огромное за такое обьяснение. Ломал голову а тут всё настолько понятно!!!
    Лайк подписка!!!

  • @user-km8kb3xj1p
    @user-km8kb3xj1p 2 года назад +1

    Хорошее, информативное видео! Спасибо за урок!

  • @manofsteppe179
    @manofsteppe179 2 года назад +1

    Рахмет! Вы умеете объяснять сложные вещи простыми примерами. Для основы самое то, очень лаконично и взаимосвязано, не то что у других авторов даже платных курсов, коих у меня много, создают переменные от балды, во время исполнения пропадает некая логическая связка вместе с этим и желание дальше смотреть. Как же все это парадоксально. Все жду момента когда вы выпустите полноценный буткемп по js, неее неее 2-х часов мало))

    • @stackdev
      @stackdev  2 года назад +1

      Спасибо! как раз работаю над этим:)

  • @Abubaxi
    @Abubaxi Год назад +1

    очень хорошее видео!!!! спасибо большое

  • @DerAleksey
    @DerAleksey Год назад +1

    ух как незаметно пролетел урок

  • @yuryarakelove5322
    @yuryarakelove5322 2 года назад +1

    Великолепное объяснение замыкания

  • @javascript7676
    @javascript7676 2 года назад +1

    Отличное объяснение! Василий)

  • @secondnamefifthname
    @secondnamefifthname Год назад +1

    Самое прекрасное объяснение, спасибо!

  • @mountainprogrammer
    @mountainprogrammer Год назад +1

    Пожалуй, Лучшее объяснение!

  • @syuzannanasukhova5777
    @syuzannanasukhova5777 Год назад +1

    Большое спасибо за такое грамотное разъяснение!!!)

    • @stackdev
      @stackdev  Год назад

      Спасибо за поддержку!

  • @erzhan225
    @erzhan225 2 года назад

    Спасибо, очень понятным языком всё описано.

  • @therelaxingsound6903
    @therelaxingsound6903 11 месяцев назад +1

    Спасибо!!! 🤩

  • @minerinlove9338
    @minerinlove9338 2 года назад +1

    Лучший! Раза 3-4 учил, и тут прям осенило как все просто. Спасибо у Вас талант учить. Сам тренер по хоккею, не вру)!

    • @stackdev
      @stackdev  2 года назад

      :) Спасибо!

  • @user-ch9qk3ee5n
    @user-ch9qk3ee5n 2 года назад +1

    спасибо, Василий)

  • @AchtungBaby-io7zl
    @AchtungBaby-io7zl Год назад +5

    очень понятные примеры. Было б еще в конце реальное применение...
    Спасибо!

    • @andTutin
      @andTutin Год назад

      сокрытие реализации, кеширование и проч, но это продвинутые темы уже

  • @razvalnuy
    @razvalnuy Год назад +2

    это наверное если не ошибаюсь 3 видео если не 4-ое , и только сейчас я догнал что значит замыкание, спасибо за помощь!

  • @user-dq7jd3yd4s
    @user-dq7jd3yd4s Год назад

    Спасибо, очень доступно!

  • @Sashad2003
    @Sashad2003 Год назад +1

    Купил урок на UDEMY и ничего не понял🤦‍♂ . Нашел ваш ролик и все стало на свои места. Спасибо!!! 😊👍

  • @user-ji6mp1jo4u
    @user-ji6mp1jo4u Год назад +1

    Понятно и ясно.

  • @perchinina
    @perchinina Год назад +1

    Спасибо Вам огромное за объяснение, на 0-ой минуте первый раз слышала слово "замыкание", к 8-ой могла объяснить, что это такое😌

    • @stackdev
      @stackdev  Год назад

      Спасибо!

    • @Syberby
      @Syberby Год назад +1

      завтра без реального применения, забудешь)

  • @kirillguryanov4925
    @kirillguryanov4925 Год назад +1

    Спасибо, очень понятно

  • @crossmaxish
    @crossmaxish 2 года назад +1

    спасибо, всё шикарно 👍

  • @rachonak
    @rachonak 3 года назад +2

    Лайк, і підписка, всі відео супер. Більше прикладів,все дуже цікаво.

  • @vaich1738
    @vaich1738 2 года назад +1

    Спасибо

  • @andreybalatsan9336
    @andreybalatsan9336 2 года назад

    Спасибо за объяснение. Остался вопрос, а playerOne это функция высшего порядка?

  • @sergkuznetzov3469
    @sergkuznetzov3469 3 года назад +1

    Хороший канал!!! Так внутренняя функция берёт не только переменную,но и аргумент внешней ?

    • @stackdev
      @stackdev  3 года назад +4

      Спасибо! Все верно. Внутренней функции доступны переменные - которые находятся в области видимости внешней функции - включая аргументы, которые мы передаем во внешнюю функцию.

  • @tazorprod.934
    @tazorprod.934 Год назад

    Видео хорошее. Чтобы лучше тему понять, как по мне, нужно ознакомиться с таким понятием как лексическое окружение

  • @Maria-sm2qi
    @Maria-sm2qi 2 года назад +12

    "Замыкание - это возможность функции, которая находится внутри др функции, получать доступ к переменным, которые в области видимости родительской функции, даже после того, как родительская функция прекратила своё выполнение."

    • @catsapp
      @catsapp 2 года назад

      Или доступ к внутренней функции из вне области видимости внешней функции. При этом внутренняя функция запоминает окружающее ее область видимости

    • @andTutin
      @andTutin Год назад

      любая функция создает замыкание.

  • @catsapp
    @catsapp 2 года назад

    Вопрос. Когда *_внутренняя функция_* запоминает свое { лексическое окружение }, она запоминает все окружение или только те переменные которые использует?

  • @nade3282
    @nade3282 Год назад +1

    в чем смысл создания замыкания в примере гражданами если мы можем написать обычную функцию и без замыкания?

  • @Anti-Pikaper
    @Anti-Pikaper 2 года назад +2

    Базара ноль вообще вопросов не осталось

  • @novichok3417
    @novichok3417 3 месяца назад

    12:43 мы получили доступ не только к переменой score, но и к аргументу name . Вопрос меняется ли значение score во внешней функции или только во внутренней?

  • @TeomunMete
    @TeomunMete 5 месяцев назад

    Классно

  • @user-qg9ji2nb8r
    @user-qg9ji2nb8r 2 года назад +2

    отлично

  • @nouchance
    @nouchance 3 года назад +3

    👍👍👍

  • @petrplotnikov4307
    @petrplotnikov4307 Год назад

    похоже это сильно влияет на производи тельность, что если у меня несколько переменных и много игроков, вообще это правильный подход или есть способы получше, без замыканий например?

  • @user-jg5iy6zs7k
    @user-jg5iy6zs7k 2 года назад +1

    круто

  • @user-vk6wk8bs5m
    @user-vk6wk8bs5m 2 года назад

    Почему-то у меня на 3 минуте, когда вызываю функцию external(); она перечеркивается и пишется, что устарела. Код такой же, проверил. Не подскажите где искать причину?

    • @user-vk6wk8bs5m
      @user-vk6wk8bs5m 2 года назад

      нашел причину, когда переименовал функцию. Зарезервировано слово что-ли?

  • @slavkapiyavka
    @slavkapiyavka 2 года назад

    Не понимаю, каким образом аргумент из функции addressGrazdanin (имя) встаёт на место параметра в анонимной функции?

    • @karoche-tv
      @karoche-tv 2 года назад

      Потому что когда вызов createAdress(address==type) возвращает внутри себя анонимную функцию которая возвращает address и name. И это анонимная функция записывается в переменную adressGrazhdanin. И эта переменная становится функцией и хранит в себе функцию createAdress() и Антон функцию и если вызвать её возвращает address и name.
      Ну типа
      adressGrazhdanin = function(name) {
      return address и name
      }
      Если просто вызвать функцию createAdress("Гражданин") то нечего не произойдёт потому что он возвращает анонимную функцию. А у анонимная не работает без имени. Поэтому как бы присваиваем в переменную чтобы использовать эту функцию.

  • @evand.349
    @evand.349 2 года назад +1

    При каждом запуске playerOne или playerTwo, начиная с первого запуска, должна создаваться переменная score и обнуляться согласно let score = 0; и, т.о. счётчик должен показывать всё время 1. В чём тут дело не пойму?
    И где мы обращаемся к внутренней функции? Мы всё время обращаемся к внешней функции createPlayer.

    • @stackdev
      @stackdev  2 года назад

      Создайте (или скопируйте) репозитоий проекта, посмотрите логи, поиграйте логикой - и все станет понятно!

    • @andTutin
      @andTutin 2 года назад +5

      createPlayer вызывается один раз и возвращает функцию в переменную playerOne. Другую, не createPlayer. В нашем случае это scoreCount. Поэтому вызывая playerOne, ты по сути вызываешь scoreCount (а там никакого обнуления нет, только увеличение на 1)

  • @RefuelTheRocket
    @RefuelTheRocket Год назад

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

  • @realmanproject7529
    @realmanproject7529 2 года назад

    а почему пеерменные обьявляются через конст?

    • @catsapp
      @catsapp 2 года назад +2

      Щас такая мода

  • @whatisloveel
    @whatisloveel Год назад

    Что это за шрифт?

  • @user-eh7no3me3x
    @user-eh7no3me3x Год назад

    некуя не понятно, but очень интересно

  • @user-qj2yg1rn3j
    @user-qj2yg1rn3j 2 года назад +1

    Благодарю, но определение я не запомню

  • @user-tc6pi1nc2r
    @user-tc6pi1nc2r Год назад +1

    like

  • @KimarTV
    @KimarTV Год назад

    А зачем это нужно?

  • @MrGeorgeMS
    @MrGeorgeMS Год назад +1

    Механизм понял, но полезного применения замыкания не вижу (((

  • @apmypa.b.291
    @apmypa.b.291 29 дней назад

    Походу все всё поняли кроме меня) Почему родительская функция неактивна? Она же запускается каждый раз, просто через функцию обёртку. А к функции внутри мы не обращаемся ни разу кроме как запуская родительскую. Я не понял тейка.

  • @bikadorov
    @bikadorov 10 месяцев назад

    Так и не понял, как автор вывел в консоль результат работ функций createPlayer() если нигде в коде нет команды вывода в консоль. Или мозги уже после объяснений отъехали

    • @frankshepherd5953
      @frankshepherd5953 10 месяцев назад

      он вызывал функцию прямо в консоле где > | и тут пропиши playerOne() нажми enter все получится

  • @user-ij5vu4jn5w
    @user-ij5vu4jn5w Год назад

    Я не понимаю. Тут же просто присваевается то что возвращает внешняя функция канстанте, вот и все. То есть главное что у нас в ретурне. Мы бы могши на писать ретурн А и тогдабы константа содержала просто строку А.

  • @galievramil1169
    @galievramil1169 2 года назад +2

    Привет, если есть время и желание, можешь потестировать меня по js!
    Я новичок, но оч хочу программировать..
    Твой урок по классам очень крутой!

  • @grantorino3465
    @grantorino3465 Год назад +1

    замыкание через возврат функции из функции это просто один из частных случаев замыкания, это не его опредление. Замыкание может быть и без функции в функции. Так что обьяснение не сосем корректное.

    • @nefed-L
      @nefed-L Год назад

      А какие ещё варианты могут быть? Подобные примеры с функцией в функции везде практически, где объясняют тему замыкания.

  • @thecatwrites9731
    @thecatwrites9731 2 года назад +1

    блин крутое объяснение, но все ровно пока не понял(

    • @stackdev
      @stackdev  2 года назад

      :) а вы просто смотрели - или код за мной писали?

    • @thecatwrites9731
      @thecatwrites9731 2 года назад

      @@stackdev сейчас буду писать код)
      но тогда смотрел) я немного не пойму саму соль этого)
      я бы хотел с вами пару минут поговорить на эту тему может вы меня в правильную сторону направите)))))))))))))))

    • @stackdev
      @stackdev  2 года назад +2

      @@thecatwrites9731 Знаете, для меня, любое самое крутое объяснение - обязательно болжно быть дополнено написанием кода собственными руками (часто многократным...).... Без это никак. Напишите сами - без подсказок, поставьте логи - и все встанет на свои места:)

    • @thecatwrites9731
      @thecatwrites9731 2 года назад +1

      @@stackdev спасибо за хороший совет!!!

  • @whiterhino752
    @whiterhino752 9 месяцев назад

    Grazhdanka XD

  • @user-xp7zh5yr9f
    @user-xp7zh5yr9f 9 месяцев назад

    В JavaScript все функции являются замыканиями, но есть исключение: функции которые объявлены через синтаксис new Function().

  • @user-xv5bt2fy2z
    @user-xv5bt2fy2z 2 года назад

    переменная grazhdanin как-то не по феншую. Плохому учите.

  • @user-xn2cr5oe4p
    @user-xn2cr5oe4p 5 месяцев назад +1

    Непонятно объясняешь

  • @greykoff3325
    @greykoff3325 Год назад

    function outerData(){
    if(oData.convert_to === "ft"){pereshetka = oData.value * 3.2808;
    console.log('GGGGGGGGGG',pereshetka);
    }
    return pereshetka;
    }
    Доброго ввечора есть функция - а в из нее нужно как то достать доступ до переменной в глобальную область видимости когда делаю как у Вас подсказано - console.log віводіт undefined.
    var pereshetka=0;
    oAJAX = new XMLHttpRequest();
    oAJAX.open("GET","data.json", true);
    oAJAX.onreadystatechange = function () {
    var oData;
    //const accessToInner = outerData();
    var oOutput = document.getElementById("info");
    if ((oAJAX.readyState == 4) && (oAJAX.status == 200)) {
    var oData = JSON.parse(oAJAX.responseText);
    function outerData(){
    if(oData.convert_to === "ft"){pereshetka = oData.value * 3.2808;
    console.log('GGGGGGGGGG',pereshetka);
    }
    return pereshetka;
    }
    //const result = {unit: oData.convert_to, value: convertFunction(oData.distance.value, oData.distance.unit, oData.convert_to)}
    {
    //console.log(' Hello', result);
    var oP;
    var Dlinacount = oData.distance.lenght;
    for (i in oData.distance ){
    console.log(oData.distance[i]);
    console.log('HERNA', oData.distance.value);
    if (!oData.distance.value) {
    break;
    }
    else{
    console.log(oData.distance)
    oP = document.createElement ("p");
    console.log(oData.distance[i])
    oP.textContent = oData.distance.unit + " " + oData.distance.value;
    oOutput.appendChild(oP);
    }
    }
    }
    const mygav = outerData();
    console.log('HAHGAHAHAHA',mygav);
    }
    }
    oAJAX.send();

  • @yuriytheone
    @yuriytheone Год назад

    Только родительская функция так и останется в стеке, и не важно "работает" она или нет. Всё её локальные переменные и параметры останутся в стейке пока она не вернёт управление. Неудивительно, что внутренняя функция будет "видеть". Только в JS это вызывает дикий экстаз... Да, и Closure не переводится, как Замыкание с английского....