Урок 3. JavaScript. Что такое замыкания. Как они работают (+ примеры)

Sdílet
Vložit
  • čas přidán 6. 06. 2019
  • Получить профессию Frontend разработчика -
    bit.ly/3wwxsHf
    Подробнее узнать об обучении в Result School -
    bit.ly/3Ooe2IU
    Бесплатный курс HTML & CSS - bit.ly/430vsTK
    Сделать 5 проектов на JavaScript - bit.ly/3SXpbUn
    Я в соц сетях:
    Telegram: t.me/js_by_vladilen
    VK: vladilen.minin
    Instagram: / vladilen.minin
    Мои паблики по JavaScript:
    Telegram: t.me/result_school_it
    VK: result.school
    Instagram: / result.scho. .
    JavaScript cообщества:
    Discord: / discord
    Telegram: t.me/js_by_vladilen_chat
    Roadmap по каналу:
    vladilen.notion.site/Roadmap-...
    Урок 3. JavaScript. Что такое замыкания. Как они работают
    В видео я расскажу, как работаю замыкания.
    Вы увидите 2 примера того, как их применять в Javascript
    В конце ролика будет небольшая практика на замыкания и контекст
    Сложный JavaScript простым языком:
    • Урок 1. JavaScript. Чт...

Komentáře • 728

  • @VladilenMinin
    @VladilenMinin  Před 5 lety +300

    Смогли сами реализовать bind? Как вам идея с практикой в конце?)

    • @NVsquare
      @NVsquare Před 5 lety +61

      Если уж и писать свой байнд, то и эплай тогда тоже надо было свой )

    • @VladilenMinin
      @VladilenMinin  Před 5 lety +4

      @@NVsquare Без него никак)

    • @andreyopanasenko8771
      @andreyopanasenko8771 Před 5 lety +1

      Отличный урок! А можно же в возвращаемой функции не использовать Rest, а в apply() сразу передавать arguments?

    • @VladilenMinin
      @VladilenMinin  Před 5 lety +2

      @@andreyopanasenko8771 Лучше Array.from(arguments)

    • @gegrbydfcz
      @gegrbydfcz Před 5 lety +2

      Спасибо за урок!
      У меня не получилось передать дополнительные параметры в функцию bind, которые передаются массивом args. В console.log выводится undefined вместо передаваемого параметра. Получается примерно такой вывод "Person: Михаил, 22, Frontend, undefined"
      Можете ли подробнее объяснить как использовать доп параметры?

  • @indigosay
    @indigosay Před 4 lety +141

    Автор объяснил понятнее за 11 минут, чем Кантор, которого я полдня читал и не понял до конца!

    • @ignatmv.8654
      @ignatmv.8654 Před 4 lety +8

      Кантор в новой редакции совсем не сахар.

    • @ihorpopovskyi4862
      @ihorpopovskyi4862 Před 4 lety +2

      Там такая дичь. Так сложно написано(

    • @indigosay
      @indigosay Před 4 lety +15

      @@ihorpopovskyi4862 это по-началу сложно, просто каждый день читай статьи, гугли и ютубь, ну и пробуй свой код писать и смотри что происходит. Со временём мозг сам поймёт чо-как, будешь к этому хладнокровно относиться и молча делать всё правильно и без эмоций.

    • @ihorpopovskyi4862
      @ihorpopovskyi4862 Před 4 lety +1

      @@indigosay Ты не понял, я конкретно про эту тему, а в основном там гораздо проще чем на MDN, например)

    • @user-rz1bn3gl7q
      @user-rz1bn3gl7q Před 4 lety +4

      @@ihorpopovskyi4862 на MDN сухая инфа чисто повторить то, что ты чуть-чуть позабыл,. имхо

  • @user-ls3id2kz3o
    @user-ls3id2kz3o Před 2 lety +40

    стоило сказать, что apply или call можно было использовать при написании кастомного bind )) в остальном отличное видео

  • @antontuchkin9396
    @antontuchkin9396 Před 4 lety +44

    Огромное спасибо за такой ценный free материал! Есть маленькая просьба, для таких новичков как я, было бы очень ценно понимать в каких случаях применять полученные знания. Пара примеров из реальной жизни.

    • @user-vp1pu1pz6m
      @user-vp1pu1pz6m Před 7 měsíci

      там как раз и были наведены примеры из реальной жизни, например urlGenerator

  • @some_user1337
    @some_user1337 Před 5 lety +21

    Отдельное спасибо за примеры использования, не всегда понятно где и как реализовать ту, или иную особенность. 👍

  • @ilgul9177
    @ilgul9177 Před 4 lety +7

    Коротко, понятно + практика... Как итог - отличный урок. В общем как всегда.

  • @arseeq
    @arseeq Před 3 lety +4

    Это талант так легко и просто объяснять вещи. Спасибо!

  • @dizelvinable
    @dizelvinable Před 4 lety +70

    В конце блоки со ссылками на другие видео перекрывают экран и не видно кода.

    • @olegonkos
      @olegonkos Před 3 lety +8

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

    • @dizelvinable
      @dizelvinable Před 3 lety +2

      @@olegonkos спасибо, чувак

    • @itrisia
      @itrisia Před 3 lety +1

      @@olegonkos лучше поздно, чем никогда

    • @materna432
      @materna432 Před 3 lety +1

      @@olegonkos Это только до тих пор пока не перезагрузить страницу. Ну или селектор вкинуть в фильтры addblock

    • @materna432
      @materna432 Před 3 lety

      ##.ytp-ce-element - да вот такой фильтр нужно добавить в addBliock и он сам зарежит эти рекомендации

  • @vadimtregubenko5749
    @vadimtregubenko5749 Před 3 lety +26

    Что-то я не совсем понял.
    Каким образом заполняется параметр с массивом ...args в замыкании?
    В bind передается контекст ( объекты ) и функция.
    А дальше как замыкающая получает параметры ?

    • @iamboikodmytro
      @iamboikodmytro Před 22 dny

      Да там ...args вообще по сути не нужен...

    • @AlexVaronin
      @AlexVaronin Před 2 dny

      Должно было быть так:
      function logPerson() {
      console.log(`Person: ${this.name}, ${this.age}, ${this.job}`);
      }
      function bind(context) {
      return (fn) => fn.apply(context);
      }
      const person1 = { name: "Михаил", age: 22, job: "Frontend" };
      const person2 = { name: "Елена", age: 19, job: "SMM" };
      bind(person1)(logPerson);
      bind(person2)(logPerson);

  • @tylerdurden9008
    @tylerdurden9008 Před 3 měsíci +1

    Очень хорошо! Исчерпывающая информацию + сразу же можно выполнить самостоятельное задание и тут же его проверить. Большое спасибо автору, за возможность подтянуть свои знания!

  • @user-il9nt4hl8u
    @user-il9nt4hl8u Před 3 lety +6

    Спасибо за видео! До момента, когда откуда-то появились ARGS было все понятно.

  • @zerocool14pvo
    @zerocool14pvo Před 5 lety +21

    Красавчик, видео одно за другим!

    • @VladilenMinin
      @VladilenMinin  Před 5 lety +10

      Главное не сбавлять темп)

  • @Aaaa-jn4bm
    @Aaaa-jn4bm Před 2 lety +33

    Мне кажется что в этом видео пропустили самый главный момент, без которого замыканий не существовало бы - вы пропустили момент создания лексического окружения, которое выполняется каждый раз при вызове функции

    • @crn05
      @crn05 Před rokem

      наверное чтобы не усложнять и так сложную тему.

    • @denishaleckiy8303
      @denishaleckiy8303 Před rokem +14

      @@crn05 это центральный момент, на котором все работает... буквально, кроме этого ничего нет

    • @user-ni4oh6rs3e
      @user-ni4oh6rs3e Před 16 dny

      @@crn05 усложнять? Тебе в видосе показали примеры не объяснив как работает. При этом объяснение темы заняло бы 5 минут и уже не нужны бы были эти подливные примеры из любой статьи на 11 минут. На собесе если спросят то спросят именно в контексте окружения и т.д, а не на примеры "функции внутри функции" смотреть будут

  • @user-fw4ew8wf3b
    @user-fw4ew8wf3b Před 2 lety +36

    Исходные данные задачи в конце ролика:
    function logPerson() {
    // console.log(`Person: ${this.name}, ${this.age}, ${this.job}`)
    // }
    // const person1 = {name: 'Михаил', age: 22, job: 'Frontend'}
    // const person2 = {name: 'Елена', age: 19, job: 'SMM'}
    // bind(person1, logPerson)
    // bind(person2, logPerson)

    • @khoth1988
      @khoth1988 Před rokem

      Нечитабельная срань же.

    • @Ghost15NG
      @Ghost15NG Před rokem +1

      @@khoth1988 что тебе нечитабельно? условия задачи, которые достаточно скопировать и использовать для решения?

    • @khoth1988
      @khoth1988 Před rokem

      @@Ghost15NG замыкания.

  • @kostasancez2358
    @kostasancez2358 Před 5 lety +135

    Ещё интересно было бы про AJAX, c практикой, короче скоро это будет топовый канал на ютубе с годными уроками по фронту))

    • @Andreikatm
      @Andreikatm Před 4 lety +1

      XMLHttpRequest (XHR), AJAX, REST и тд жду!!!

    • @roman--s
      @roman--s Před 4 lety +4

      В моде FETCH , Socket.io. REST API да, нужная штука.

  • @user-pk2rw1li2q
    @user-pk2rw1li2q Před 3 lety +2

    Премию оскар за лучшее русскоязычное объяснение javascripta )

  • @lumeaceaiuluisrl6343
    @lumeaceaiuluisrl6343 Před 3 lety +1

    На самом деле, Вы большой молодец, Владилен)) Спасибо!

  • @user-yx4ov2xx8s
    @user-yx4ov2xx8s Před 4 lety +1

    Спасибо большое за этот плейлист! 👍👍😊

  • @grangeld
    @grangeld Před 3 lety

    Огромное Спасибо! я понял наконец-то что такое замыкание. Надеюсь ты продолжишь снимать ролики, они отличные!!!

  • @CHEloveg22
    @CHEloveg22 Před 4 lety

    Самое доступное объяснение. Спасибо большое за труд!

  • @igordudin289
    @igordudin289 Před 4 lety

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

  • @ns-br9zw
    @ns-br9zw Před 4 lety +1

    Замечательное объяснение. Спасибо!

  • @user-ox8ni9oz2p
    @user-ox8ni9oz2p Před 2 lety

    Кайф! Тяжело найти в инете такое понятное объяснение. Спасибо!

  • @unheilbar
    @unheilbar Před 4 lety +1

    Ваш контент из русскоязычного один из лучших, что я видел/читал.

  • @alextopsite
    @alextopsite Před rokem

    Лучшее объяснение замыканий в JavaScript, что я слышал

  • @dmitriyshisterov8400
    @dmitriyshisterov8400 Před 3 lety

    Чувак, огромная благодарность!) Великолепно объясняешь!

  • @user-lw3qt4zb6p
    @user-lw3qt4zb6p Před 4 lety

    Ты лучший. Наконец стал понятен смысл замыканий

  • @vyacheslavvasilev1776

    Действительно простым языком. Спасибо за материал, помогли разобраться!

  • @XenonGamesChannel
    @XenonGamesChannel Před 4 měsíci

    Лаконично!!👍👍👍 без воды и с реальными примерами

  • @alexispell4251
    @alexispell4251 Před 4 lety +10

    Не скажу ничего нового... Ты просто великолепен) Даешь окрепнуть в понимании нативного js так, как не делают другие и близко... На очереди приобретение курса по Node. Спасибо за все твои труды

  • @Leo-ke3hv
    @Leo-ke3hv Před 4 lety +1

    объясняешь великолепно

  • @alik64
    @alik64 Před 2 lety

    я наконец-то понял, что такое замыкание , спасибо тебе огромное 🚀

  • @vazgenaleksanyan2929
    @vazgenaleksanyan2929 Před 5 lety +1

    круто все. Было здорово посмотреть твой урок по созданию JAVASCRIPT плагина.

  • @gelosx1
    @gelosx1 Před 3 lety +3

    Владилен, спасибо за классный контент - подача и материал, всё на очень высоком уровне.
    В некоторых комментариях здесь утверждается, что в видео идет речь о функциях высшего порядка а не о замыканиях.
    То что это функция высшего порядка, не отменяет тот факт , что здесь также присутствует замыкание:
    1. Так как для функции внешним окружением является место, где она была объявлена, а не место
    где она была вызвана, то в нашем случае анонимная функция которую мы возвращаем как результат выполнения
    функции bind,получит в качестве ссылки на внешнее лексическое окружение, ссылку на лексическое окружение самой
    функции bind.
    При этом, эти ссылки сохраняются в так называемой куче(heap), что позволяет им, в отличии от непосредственно самой
    функции, выполняющейся в стеке и удаляющейся оттуда сразу после того как функция завершит свою работу, оставаться в
    памяти до удаления сборщиком мусора.
    2. К лексическому окружению функции относятся не только ее параметры, но и аргументы. Поэтому, в нашем случае
    и context и fn также входят в лексическое окружение функции bind.
    Теперь, если:
    const func = bind(person1,LogPerson)
    то :
    при вызове func(), произойдет следующее:
    для получения context и fn функция сначала обратиться к своему лексическому окружению,
    так как их там нет, то она по имеющейся у неё ссылке начнёт поиск в лексическом окружении внешней функции,
    где она была объявлена, именно этот момент и есть замыкание.
    Вот мои два варианта решения задачи:
    Для чистоты эксперимента, сделал функционал как у оригинального bind, без явного добавления функции в параметры
    и чтоб совсем все было своим, функцию apply также сделал кастомной:
    _________________________________________________________________________
    Object.prototype.myApply = function (context,args) {
    if(!Array.isArray(args)) throw new Error('parameter is not Array');
    const tempContext = {...context, appliedFunc: this};
    tempContext.appliedFunc(...args)
    };
    Object.prototype.myBind = function (context,...args) {
    const boundFunc = this;
    return function () {
    boundFunc.myApply(context,args)
    }
    };
    logPerson.myBind(person1)()
    _________________________________________________________________________
    Или другой вариант, наиболее оптимальный, объединяющий эти две функции:
    _________________________________________________________________________
    Object.prototype.myBind2 = function (context,...args) {
    const tempContext = {...context, boundFunc: this};
    return function () {
    tempContext.boundFunc(...args)
    }
    }
    logPerson.myBind(person2)()
    _________________________________________________________________________

    • @Icmana
      @Icmana Před rokem

      ------------- Базовая функция ------------
      logPerson.bind (p1)( )
      вывод:
      Person: M, 22
      this: {name: 'M', age: '22'}
      age: "22"
      name: "M"
      [[Prototype]]: Object
      ------------- Ваш пример ------------
      logPerson.myBind2 (p1)( )
      вывод:
      Person: M, 22
      this: {name: 'M', age: '22', boundFunc: ƒ}
      age: "22"
      boundFunc: ƒ logPerson()
      name: "M"
      [[Prototype]]: Object
      ------------- Мой вариант я без аргументов делал, но добавить их не сложно ------------
      bind (p1, logPerson)( )
      вывод:
      Person: M, 22
      this: {f: ƒ}
      f: ƒ logPerson()
      [[Prototype]]: Object
      age: "22"
      name: "M"
      [[Prototype]]: Object
      Реализация, тоже думал что apply и call пользовать не положено
      function bind(obj, func) {
      const nobj = {f: func};
      Object.setPrototypeOf(nobj, obj);
      return (function() {nobj.f()});
      }
      А вот так легко call можно сделать
      function bind(obj, func) {
      const nObj = {f: func};
      Object.setPrototypeOf(nObj, obj);
      nObj.f();
      }

  • @genykm
    @genykm Před 4 lety +60

    А почему ни слова об областях видимости переменных во вложеных функциях? Мне кажется это тоже важно в данном контексте.

    • @andTutin
      @andTutin Před 2 lety

      а что там поменялось ?

    • @GoPro-ts5sh
      @GoPro-ts5sh Před 2 lety +1

      @@andTutin var задизили, стрессует

    • @epic3386
      @epic3386 Před 2 lety +4

      а об этом ты узнаешь если купишь курс! и там тебе дадут новое видео где раскроют твой вопрос, но не скажут ещё о чем-нибудь, об этом тебе расскажут уже в следующих купленных видео )) и так до тех пор пока ты не поумнеешь и не начнёшь читать книги по js'у))

    • @genykm
      @genykm Před 2 lety

      @@epic3386 уже работаю в Оракле, так-что не актуально )

    • @epic3386
      @epic3386 Před 2 lety +1

      Мои искренние поздравления )) видимо начал читать книжки?))

  • @KuKu_RuKu88
    @KuKu_RuKu88 Před 4 lety

    ОЧЕНЬ ХОРОШО ОБЪЯСНИЛИ. СПАСИБО

  • @user-ts4pq8mh7u
    @user-ts4pq8mh7u Před 4 lety +15

    Хочу сказать что твой контент очень крутой! Наконец то не тот контекст как объявлять и складывать переменные а именно то что нужно.

  • @BrainOverflow-eof
    @BrainOverflow-eof Před 2 lety

    Спасибо, это лучшее объяснение.

  • @user-be8yr8lh8z
    @user-be8yr8lh8z Před 4 lety

    Отличный контент, спасибо большое)))

  • @user-ku2sn1wz1c
    @user-ku2sn1wz1c Před 2 lety

    Лучший способ научить - самый простой!
    Спасибо, переплюнул 90% инфы на эту темую

  • @user-co3kd1ej7o
    @user-co3kd1ej7o Před 4 lety +1

    я вот просто, благодарен за твои уроки!!!!!!!!!!!

  • @user-nw3nt9kq6m
    @user-nw3nt9kq6m Před 3 lety

    Спасибо тебе, Ленин, ты крут!

  • @unknown.6914
    @unknown.6914 Před rokem

    прекрасный урок, спасибо 😊

  • @malina5639
    @malina5639 Před 2 lety

    Браво! Все супер понятно! Спасибо!

  • @_akunin3674
    @_akunin3674 Před 3 lety

    Отличный контенет. Спасибо

  • @RewCSharp
    @RewCSharp Před 5 měsíci

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

  • @alekseygaikevich4195
    @alekseygaikevich4195 Před 4 lety

    Спасибо) отличное объяснение!!

  • @pitbrest
    @pitbrest Před 2 lety +4

    Как уже писал кто-то ранее, первые два ролика прям доходчиво, тут пример в конце выбивает из колеи понимания.

  • @user-vd9yw5ez3e
    @user-vd9yw5ez3e Před 4 lety

    Владлен, у тебя ахрененный канал. Побольше бы таких))

  • @razumizm
    @razumizm Před 4 lety +51

    10:50 Оператор Rest, а не Spread в данном случае. Spread используется для разделения коллекций на отдельные элементы, а rest, наоборот, для соединения отдельных значений в массив.

  • @user-yk9nj6co9d
    @user-yk9nj6co9d Před rokem

    Всё ясно и понятно. Спасибо.

  • @user-bu4lx9ox9z
    @user-bu4lx9ox9z Před rokem

    Спасибо за хорошее объяснение.)

  • @user-zp8xz5fu2j
    @user-zp8xz5fu2j Před 4 lety

    О боги,я понял это спустя неделю попыток и тонны лит-ры и видео) Прикладные примеры - самое важное,за это отдельное спасибо!

    • @user-zp8xz5fu2j
      @user-zp8xz5fu2j Před 3 lety

      @@ne4to777 Почему ты так уверен?)

    • @user-zp8xz5fu2j
      @user-zp8xz5fu2j Před 3 lety

      @@ne4to777 Ну не в развернутой форме, очевидно (формат не подразумевает)
      Но все же, базовое понимание видео дало

  • @Woody_Johnson
    @Woody_Johnson Před 2 lety +15

    Спасибо большое за объяснение!
    Но всё же не совсем понятно, зачем в данном случае нужно замыкание. Можно ведь в рамках одной функции всё сделать:
    function bind(context, fn) {
    return fn.call(context)
    }
    Какой практический смысл здесь в замыкании?

    • @lemmesolo
      @lemmesolo Před rokem

      там даже return не нужен

    • @cleardoc7554
      @cleardoc7554 Před rokem

      тогда ведь теряется смысл, который заложен в оригинальный bind: сначала указывается контекст, затем вызывается. Собственно, замыкание в этом случае и служит как раз для "отложенного" вызова.

  • @hasst9261
    @hasst9261 Před 4 lety

    Спасибо за уроки, отличное качество.

    • @VladilenMinin
      @VladilenMinin  Před 4 lety

      Благодарю за отзыв)
      Ознакомься с другими роликами на канале

    • @hasst9261
      @hasst9261 Před 4 lety

      @@VladilenMinin Я знаком, спасибо и буду знакомиться дальше). Удачи в делах!

  • @user-eh1nj8el9l
    @user-eh1nj8el9l Před 3 lety

    Шикарная информация!

  • @renat_mg6881
    @renat_mg6881 Před 3 lety

    Отличный урок!

  • @user-nw3nt9kq6m
    @user-nw3nt9kq6m Před 3 lety

    Комментарий из восьми слов для поддержки этого видео.

  • @stanislavmalyshev5209
    @stanislavmalyshev5209 Před 2 lety

    Вообще лучшее объяснение!

  • @anastasijavvo
    @anastasijavvo Před rokem

    спасибище, реально все четко и понятно!

  • @olesilin3011
    @olesilin3011 Před rokem +2

    Примеры и задачи должны решаться с замыканием проще и изящней, чем без него. Иначе вопрос "зачем" остается не раскрыт. А по механике все очень доходчиво.

  • @bobmagrega
    @bobmagrega Před rokem

    Спасибо. Именно у вас понял.

  • @iznu3
    @iznu3 Před 3 lety

    Спасибо за видео!

  • @yury497
    @yury497 Před 11 měsíci +1

    На мой взгляд стоило сделать немного иначе.
    function bind(fn) {
    return function(context) {
    fn.apply(context)
    }
    }
    const personData = bind(logPerson)
    Получили функцию, возвращающую данные любого человека.

  • @VladimirDevyatoff
    @VladimirDevyatoff Před 4 lety

    Довольно простая тема, если по человечески её объснить) Спасибо, наконец-то понял на 100%

    • @VladimirDevyatoff
      @VladimirDevyatoff Před 3 lety

      @@ne4to777 это когда функция получила внешнюю переменную и забыла про внешнюю)

    • @VladimirDevyatoff
      @VladimirDevyatoff Před 3 lety

      @@ne4to777 ага. работает с ней как с копией)

  • @romasbitinas643
    @romasbitinas643 Před rokem

    Спасибо вам за видео

  • @Abdul-hy4cy
    @Abdul-hy4cy Před 2 lety

    Спасибо. С 4-ого раза просмотра видео, мне всё же удалось, самому написать функцию bind работающую.

    • @VladilenMinin
      @VladilenMinin  Před 2 lety

      На канале есть подробный ролик про его создание)

  • @sasharudenko5446
    @sasharudenko5446 Před 4 lety +21

    я что-то не вкурил про аргументы. они ведь не передаются. откуда они появляются ?
    а с учетом первичного задания, все вообще сводится до fn.apply(context)()

    • @user-ql4xu5qu2u
      @user-ql4xu5qu2u Před 4 lety +1

      Там не аргументы появились, а поля объекта из контекста. Я так понял параметры функция принимает, потому что спроектирована с запасом на разные ситуации.

    • @tentacle8148
      @tentacle8148 Před 3 lety

      Они появляются от rest params

  • @alira2924
    @alira2924 Před 4 lety

    Спасибо за урок

  • @sekirogenshiro2210
    @sekirogenshiro2210 Před 4 lety

    офигенный урок

  • @ugolblab6940
    @ugolblab6940 Před 3 lety +1

    Добрый день, подскажет пожалуйста, а вложеная фукция ведь может быть стрелочной? И если да то будет ли она работать так же как и с обычным декларированием? И нет ли каких-то подводных камней с использованием this в обоих случаях. Спасибо

  • @vladvdovychenko
    @vladvdovychenko Před 2 lety +3

    Спасибо большое за урок. Только есть вопрос про последнее действие.
    Понятно что метод apply() должен обязательно иметь два параметра, но что имеется ввиду под массивом ...args ? не понял зачем нужно передавать внутри второй функции ещё какие-то параметры, если функция bind требует только обьект для контекста (person) и саму функцию вывода (logPerson) информации в консоли ?

  • @mukhammadrustambayev2051
    @mukhammadrustambayev2051 Před 5 lety +25

    далее: callback, promise, async/await.

  • @zeNoldor
    @zeNoldor Před rokem

    Огромное спасибо! Шедевральное обьяснение с примерами. Как минимум, можно будет обьяснить на собеседовании принцип работы или написать самому, а не пытатьсчя заучивать непонятные словешки)))

  • @galibibr02
    @galibibr02 Před rokem

    четко объяснил, спс

  • @avakarchuk
    @avakarchuk Před 10 měsíci

    Спасибо! Наконец Я понял замыкание полностью 😂

  • @DrZlad
    @DrZlad Před 2 lety +1

    Большое спасибо Автору за: показал зачем оно в практическом смысле надо. А то остальные только счетчик показывают и всё

  • @littlepony7160
    @littlepony7160 Před rokem

    Страшная тема для соло-обучения в онлайн-учебниках. В статье со скопом из "контекста", "лексического окружения" и "сборщика мусора" - можно впасть в депрессию. Напоминает мене, как меня в колледже учили "что такое транзистор" в течении целого года + курсовая по ним. Ну и тот самый страх, при мысли того, что тебе когда-то придётся его использовать. Так сильно заваливать информацией, когда это можно обьяснить так просто.
    Спасибо за ваш ролик. Какой же всё-таки талант - уметь обьяснять вещи просто.

  • @wawawf
    @wawawf Před 5 lety +2

    годнота!

  • @juriskrumgolds5810
    @juriskrumgolds5810 Před 4 lety +4

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

    • @crn05
      @crn05 Před rokem

      такое часто бывает, пользуешься чем-то, а оказывается у этого страшное название есть

  • @user-zi9xi5er4e
    @user-zi9xi5er4e Před rokem

    Вот вам детки задачка по математике из 1 класса школьной программы. Поняли? Отлично! Вот пример из 2 класса школьной программы. А вот из 3 класса. Усвоили? Замечательно, молодцы!! А теперь поставьте видео на паузу и самостоятельно решите задачку которую дают на олимпиадах по математике для 11 класса)))))) Не можете? Сейчас вместе разберём... И на самом интересном месте вылетает реклама закрывающая треть экрана))))))))))) Владлен, моё к вам уважение! Ваши уроки хороши, но понять их порой крайне не просто.

  • @user-nl6uj2dt2o
    @user-nl6uj2dt2o Před 3 lety

    Привет, отлично!

  • @paveltk3092
    @paveltk3092 Před 4 lety +2

    замыкание - функция внутри функции и все! гениально

    • @zxspectrum3352
      @zxspectrum3352 Před 4 lety +7

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

    • @bukanaka
      @bukanaka Před 2 lety

      @@zxspectrum3352 Именно так. А утверждение замыкание это вызов функции в функции не верно

  • @parahumanoid
    @parahumanoid Před 2 lety

    Не уверен, что этимология верна, но подача удобная.

  • @valerian6943
    @valerian6943 Před 3 lety

    толково объяснил

  • @QaZaQ_Stranger
    @QaZaQ_Stranger Před 6 měsíci

    Кто-то пишет ,что сложно и не понятно😂 но по мне это самое крутое обьяснение замыкания которое я видел

  • @user-dl2lm7ju2y
    @user-dl2lm7ju2y Před 4 lety

    понял. Спасибо!

  • @LIVESPORTPLUS
    @LIVESPORTPLUS Před 5 měsíci

    По последней задачки думаю нужен апдейт:
    Функция bind в вашем примере создает "обертку" вокруг функции fn, которая при вызове устанавливает this в переданный контекст context. Это позволяет вам вызывать функцию fn так, как если бы она была методом объекта context.
    Давайте разберемся, как это работает, шаг за шагом:
    1. bind принимает два аргумента: context и fn.
    2. bind возвращает новую функцию, которая при вызове будет применять функцию fn к контексту context.
    3. Когда возвращенная функция вызывается, она использует ...args для сбора всех переданных аргументов в массив args.
    4. fn.apply(context, [args]) вызывается внутри этой функции. Метод apply используется для вызова функции fn с конкретным значением this (в данном случае context) и массивом аргументов args.
    В вашем конкретном случае использование ...args и [args] вокруг args не имеет смысла, поскольку logPerson не принимает никаких аргументов, и использование apply с массивом аргументов в этом случае избыточно. Это может быть полезно, если бы функция logPerson принимала дополнительные параметры.
    Тем не менее, чтобы функция bind работала корректно с функцией logPerson, которая не принимает аргументы, вам нужно вызвать fn.apply(context) без второго параметра или использовать пустой массив для аргументов:
    function bind(context, fn){
    return function(){ // здесь args не нужны, так как logPerson их не принимает
    return fn.apply(context); // вызываем fn с контекстом context и без аргументов
    }
    }
    bind(person1, logPerson)(); // Person: Misha, 22, Frontend
    bind(person2, logPerson)(); // Person: Lena, 18, SMM
    Использование ...args и [args] имело бы смысл, если бы вы хотели, чтобы функция bind могла принимать и передавать любое количество аргументов в функцию fn, но в вашем текущем примере это не требуется.

  • @user-ql3ls2tz9n
    @user-ql3ls2tz9n Před 3 lety +1

    Здравствуйте)
    Все очень круто и интересно, но я столкнулась с такой проблемой: на странице в браузере, в консоли выводятся только ошибки, а мой редактор (Brackets) ругается на rest, то есть правильный код просто не проигрывается, хотя js файл подключен правильно, проблема не в этом. Синтаксических ошибок тоже нет. Можете подсказать пожалуйста, в чем дело может быть?

  • @8malek
    @8malek Před 4 lety +7

    Зачем или какой толк в замыкании , например в примере с url ?
    Если мы можем сделать одну функцию с двумя аргументами , function(url,domain) и тд ....
    спасибо за объяснения , понял , как работает , но не понял зачем ))

    • @ITime_shorts
      @ITime_shorts Před 4 lety

      Гибкость. Допустим создаешь переменную с ru доменом. И потом спокойно подставляешь туда только название сайта, вызывая нужную переменную. А так тебе придется постоянно писать "ru", что не очень хорошо.
      А еще, в этом уроке не показано, но классность в том, что в функции обертке, ты можешь задавать переменные и они у тебя будут хранится там, а не в глобальном поле.

  • @user-vu9pp3bm8f
    @user-vu9pp3bm8f Před 4 lety +1

    Супер!!!

  • @tyortyo
    @tyortyo Před 4 lety

    Владилен, спасибо. Я вот одно не пойму, зачем bind в методах классов, если метод вызван через this. Почему контекст может потеряться?

  • @Max-kr4ie
    @Max-kr4ie Před 5 lety

    Очень годно))

  • @user-br1tu9xh4w
    @user-br1tu9xh4w Před rokem

    Спасибо!

  • @alexey2769
    @alexey2769 Před 3 lety +5

    Спасибо за урок! Не понял только в конце в функции bind в возвращаемую функцию мы передаем args и их потом в метод apply. Как и где на практике мы можем передать эти аргументы в возвращаемую функцию? Сейчас функция bind работает и без этих аргументов

    • @dariavarenka
      @dariavarenka Před 2 lety +2

      плюсую, до меня вообще долго доходило что в примере мы это место не используем

    • @GTAlexSEO
      @GTAlexSEO Před 2 lety

      Тоже не понял - для чего в примере ...args ?

  • @IhorVyshniakov
    @IhorVyshniakov Před 3 lety +4

    Спасибо за данный плейлист, его ценность сложно переоценить, БЛАГОДАРЮ!!!
    Идея с задачками в конце просто отличная) Т к не хватало практики.
    БУДУ РАД ЕСЛИ КТО-ТО МНЕ ОБЬЯСНИТ ЗАЧЕМ В ЗАДАЧКЕ ВООБЩЕ ...args =)
    Только вот я не понимаю зачем в конечной задачке вообще замыкание и какие еще параметры вы собираетесь туда передавать, этого в условии задачи не было. Можно просто вот так сделать и так же будет все работать:
    function bind(context, fn) {
    return fn.apply(context)
    }
    bind(person1, logPerson)
    bind(person2, logPerson)
    Поэтому необходимости и смысла использования замыкания в данном примере к сожалению я не увидел, хотя хотелось применить как-то это знание. А тут по сути просто мы воспользовались альтернативой .bind(), вместо того, чтобы написать свою функцию. ИМХО.

    • @YourBrain-vc3bh
      @YourBrain-vc3bh Před 9 měsíci +1

      тоже не поняла зачем args нужен

  • @siu1941
    @siu1941 Před rokem

    спасибо за обьяснение. Но хотел бы узнать какой у тебя ноутбук? Так как хочу купить себе новый, потому что мой уже начинает гнать

  • @eurorock5912
    @eurorock5912 Před 5 lety +1

    Владилен, снимаю шляпу!) Прекрасно объясняешь теперь. Не то, что в курсах платных (если честно, не понимаю почему), может просто опыт преподавания растёт))) Так держать! То же и про .bind и .call.

    • @Max-kr4ie
      @Max-kr4ie Před 5 lety +1

      Опыт да. Владлен норм так начал рассказывать. И по делу и голос приятен.

    • @harrypolygon
      @harrypolygon Před 4 lety

      Хз по моему платные курсы у него тоже отличные

  • @kronos2003
    @kronos2003 Před 3 lety +1

    Не понял зачем args в данном случае, разве на случай, если захочется еще какие-то доп.параметры консолить, не предусмотренные в объектах person. Задача ведь решается без них, точно также можно было и call вписать. И спасибо за задачу, заставил немного напрячь мозги!

  • @user-vs6bg3xn5s
    @user-vs6bg3xn5s Před 4 lety +2

    Ты лучший фронтенд блогер. И я могу обосновать это. Во-первых: за такой короткий промежуток времени ты создал огромный канал с исчерпывающей информацией по фронтенд разработке. Во-вторых: любой человек с желанием может просто внимательно смотря твои видео по порядку и выполняя вместе с тобой задачи научиться всему за кратчайшие сроки. Все это благодаря структурированности и продуманности каждого плейлиста и видео. Я боюсь представить скольких усилий это все тебе стоило. В-третьих: все видео без лишней воды, и неуместных рофлов. В-четвертых: на этом канале я не увидел ни одного видео ради видео, каждое видео отличается от другого и раскрывает разные темы. В-пятых: четкая дикция, отлично выступаешь на камеру. Ты на верном пути братан, продолжай

    • @VladilenMinin
      @VladilenMinin  Před 4 lety +1

      Благодарю за такой отзыв, мне очень приятно)