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

Получить профессию 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. Чт...

Пікірлер: 727

  • @some_user1337
    @some_user13375 жыл бұрын

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

  • @prometheusmusic4559

    @prometheusmusic4559

    4 жыл бұрын

    Вот +++

  • @ilgul9177
    @ilgul91774 жыл бұрын

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

  • @arseeq
    @arseeq3 жыл бұрын

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

  • @VladilenMinin
    @VladilenMinin5 жыл бұрын

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

  • @NVsquare

    @NVsquare

    5 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    5 жыл бұрын

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

  • @andreyopanasenko8771

    @andreyopanasenko8771

    5 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    5 жыл бұрын

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

  • @gegrbydfcz

    @gegrbydfcz

    5 жыл бұрын

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

  • @user-ls3id2kz3o
    @user-ls3id2kz3o2 жыл бұрын

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

  • @zerocool14pvo
    @zerocool14pvo5 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    5 жыл бұрын

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

  • @user-il9nt4hl8u
    @user-il9nt4hl8u3 жыл бұрын

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

  • @antontuchkin9396
    @antontuchkin93964 жыл бұрын

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

  • @user-vp1pu1pz6m

    @user-vp1pu1pz6m

    8 ай бұрын

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

  • @tylerdurden9008
    @tylerdurden90083 ай бұрын

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

  • @lumeaceaiuluisrl6343
    @lumeaceaiuluisrl63433 жыл бұрын

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

  • @user-pk2rw1li2q
    @user-pk2rw1li2q4 жыл бұрын

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

  • @CHEloveg22
    @CHEloveg224 жыл бұрын

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

  • @user-yx4ov2xx8s
    @user-yx4ov2xx8s4 жыл бұрын

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

  • @indigosay
    @indigosay4 жыл бұрын

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

  • @ignatmv.8654

    @ignatmv.8654

    4 жыл бұрын

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

  • @ob1chyk

    @ob1chyk

    4 жыл бұрын

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

  • @indigosay

    @indigosay

    4 жыл бұрын

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

  • @ob1chyk

    @ob1chyk

    4 жыл бұрын

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

  • @user-rz1bn3gl7q

    @user-rz1bn3gl7q

    4 жыл бұрын

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

  • @alextopsite
    @alextopsite Жыл бұрын

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

  • @grangeld
    @grangeld3 жыл бұрын

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

  • @unheilbar
    @unheilbar4 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    4 жыл бұрын

    Благодарю)

  • @user-ox8ni9oz2p
    @user-ox8ni9oz2p2 жыл бұрын

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

  • @user-lw3qt4zb6p
    @user-lw3qt4zb6p4 жыл бұрын

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

  • @ns-br9zw
    @ns-br9zw4 жыл бұрын

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

  • @XenonGamesChannel
    @XenonGamesChannel4 ай бұрын

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

  • @igordudin289
    @igordudin2894 жыл бұрын

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

  • @dmitriyshisterov8400
    @dmitriyshisterov84003 жыл бұрын

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

  • @vyacheslavvasilev1776
    @vyacheslavvasilev1776 Жыл бұрын

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

  • @alik64
    @alik642 жыл бұрын

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

  • @Leo-ke3hv
    @Leo-ke3hv4 жыл бұрын

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

  • @gelosx1
    @gelosx13 жыл бұрын

    Владилен, спасибо за классный контент - подача и материал, всё на очень высоком уровне. В некоторых комментариях здесь утверждается, что в видео идет речь о функциях высшего порядка а не о замыканиях. То что это функция высшего порядка, не отменяет тот факт , что здесь также присутствует замыкание: 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

    2 жыл бұрын

    ------------- Базовая функция ------------ 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(); }

  • @user-fw4ew8wf3b
    @user-fw4ew8wf3b2 жыл бұрын

    Исходные данные задачи в конце ролика: 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

    Жыл бұрын

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

  • @Ghost15NG

    @Ghost15NG

    Жыл бұрын

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

  • @khoth1988

    @khoth1988

    Жыл бұрын

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

  • @user-zp8xz5fu2j
    @user-zp8xz5fu2j4 жыл бұрын

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

  • @user-zp8xz5fu2j

    @user-zp8xz5fu2j

    3 жыл бұрын

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

  • @user-zp8xz5fu2j

    @user-zp8xz5fu2j

    3 жыл бұрын

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

  • @vazgenaleksanyan2929
    @vazgenaleksanyan29295 жыл бұрын

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

  • @user-ku2sn1wz1c
    @user-ku2sn1wz1c2 жыл бұрын

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

  • @user-be8yr8lh8z
    @user-be8yr8lh8z4 жыл бұрын

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

  • @user-co3kd1ej7o
    @user-co3kd1ej7o4 жыл бұрын

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

  • @user-nw3nt9kq6m
    @user-nw3nt9kq6m3 жыл бұрын

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

  • @alexispell4251
    @alexispell42514 жыл бұрын

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

  • @RewCSharp
    @RewCSharp6 ай бұрын

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

  • @BrainOverflow-eof
    @BrainOverflow-eof2 жыл бұрын

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

  • @user-nw3nt9kq6m
    @user-nw3nt9kq6m3 жыл бұрын

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

  • @hasst9261
    @hasst92614 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    4 жыл бұрын

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

  • @hasst9261

    @hasst9261

    4 жыл бұрын

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

  • @KuKu_RuKu88
    @KuKu_RuKu884 жыл бұрын

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

  • @kostasancez2358
    @kostasancez23585 жыл бұрын

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

  • @Andreikatm

    @Andreikatm

    4 жыл бұрын

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

  • @roman--s

    @roman--s

    4 жыл бұрын

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

  • @malina5639
    @malina56392 жыл бұрын

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

  • @Aaaa-jn4bm
    @Aaaa-jn4bm2 жыл бұрын

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

  • @crn05

    @crn05

    Жыл бұрын

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

  • @denishaleckiy8303

    @denishaleckiy8303

    Жыл бұрын

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

  • @user-ni4oh6rs3e

    @user-ni4oh6rs3e

    29 күн бұрын

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

  • @unknown.6914
    @unknown.6914 Жыл бұрын

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

  • @user-vd9yw5ez3e
    @user-vd9yw5ez3e5 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    5 жыл бұрын

    Благодарю)

  • @user-eh1nj8el9l
    @user-eh1nj8el9l3 жыл бұрын

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

  • @alekseygaikevich4195
    @alekseygaikevich41954 жыл бұрын

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

  • @_akunin3674
    @_akunin36743 жыл бұрын

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

  • @olesilin3011
    @olesilin3011 Жыл бұрын

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

  • @renat_mg6881
    @renat_mg68813 жыл бұрын

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

  • @user-ts4pq8mh7u
    @user-ts4pq8mh7u4 жыл бұрын

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

  • @user-bu4lx9ox9z
    @user-bu4lx9ox9z Жыл бұрын

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

  • @VladimirDevyatoff
    @VladimirDevyatoff4 жыл бұрын

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

  • @VladimirDevyatoff

    @VladimirDevyatoff

    3 жыл бұрын

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

  • @VladimirDevyatoff

    @VladimirDevyatoff

    3 жыл бұрын

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

  • @stanislavmalyshev5209
    @stanislavmalyshev52092 жыл бұрын

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

  • @user-yk9nj6co9d
    @user-yk9nj6co9d Жыл бұрын

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

  • @Abdul-hy4cy
    @Abdul-hy4cy2 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    2 жыл бұрын

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

  • @paveltk3092
    @paveltk30924 жыл бұрын

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

  • @zxspectrum3352

    @zxspectrum3352

    4 жыл бұрын

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

  • @bukanaka

    @bukanaka

    2 жыл бұрын

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

  • @bobmagrega
    @bobmagrega Жыл бұрын

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

  • @anastasijavvo
    @anastasijavvo Жыл бұрын

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

  • @vadimtregubenko5749
    @vadimtregubenko57493 жыл бұрын

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

  • @iamboikodmytro

    @iamboikodmytro

    Ай бұрын

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

  • @AlexVaronin

    @AlexVaronin

    15 күн бұрын

    Должно было быть так: 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);

  • @zeNoldor
    @zeNoldor2 жыл бұрын

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

  • @iznu3
    @iznu33 жыл бұрын

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

  • @sekirogenshiro2210
    @sekirogenshiro22104 жыл бұрын

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

  • @dizelvinable
    @dizelvinable4 жыл бұрын

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

  • @olegonkos

    @olegonkos

    3 жыл бұрын

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

  • @dizelvinable

    @dizelvinable

    3 жыл бұрын

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

  • @itrisia

    @itrisia

    3 жыл бұрын

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

  • @materna432

    @materna432

    3 жыл бұрын

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

  • @materna432

    @materna432

    3 жыл бұрын

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

  • @romasbitinas643
    @romasbitinas643 Жыл бұрын

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

  • @user-nl6uj2dt2o
    @user-nl6uj2dt2o3 жыл бұрын

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

  • @Max-kr4ie
    @Max-kr4ie5 жыл бұрын

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

  • @alira2924
    @alira29244 жыл бұрын

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

  • @wawawf
    @wawawf5 жыл бұрын

    годнота!

  • @DrZlad
    @DrZlad2 жыл бұрын

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

  • @pitbrest
    @pitbrest2 жыл бұрын

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

  • @galibibr02
    @galibibr02 Жыл бұрын

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

  • @avakarchuk
    @avakarchuk10 ай бұрын

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

  • @yury497
    @yury497 Жыл бұрын

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

  • @user-zi9xi5er4e
    @user-zi9xi5er4e Жыл бұрын

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

  • @IhorVyshniakov
    @IhorVyshniakov3 жыл бұрын

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

  • @YourBrain-vc3bh

    @YourBrain-vc3bh

    9 ай бұрын

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

  • @user-vu9pp3bm8f
    @user-vu9pp3bm8f4 жыл бұрын

    Супер!!!

  • @LIVESPORTPLUS
    @LIVESPORTPLUS5 ай бұрын

    По последней задачки думаю нужен апдейт: Функция 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, но в вашем текущем примере это не требуется.

  • @ravabat5841
    @ravabat58414 жыл бұрын

    Блестящщще)

  • @QaZaQ_Stranger
    @QaZaQ_Stranger7 ай бұрын

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

  • @user-rr2nw7if7u
    @user-rr2nw7if7u4 жыл бұрын

    Годнота :))))

  • @romko-romario
    @romko-romario3 жыл бұрын

    Очередное видео на данном канале, которое было для меня невероятно полезным :) Плейлист "Сложный JavaScript простым языком" - лучшие материалы по JS из мной увиденных, в очередной раз хочу выразить благодарность автору! 9:33 Что касается задания с функцией bind, вот моё решение (в одну строчку): const bind = (obj, funct) => funct.bind(obj); Или же: function bind(obj, funct) { return funct.bind(obj); } P.S. Я не уверен на сто процентов, верное ли это решение (если оно в чём-то ошибочно, поправьте меня, кто знает лучше), но проверял с такими же объектами person, как и в примере, с функциями, которые принимают от 0 до 3 аргументов, и всё работает. UPD: нет, не всё! Функция bind должна быть каррируемой, тоесть должна уметь принимать аргументы как в первых скобках, так и во вторых. Посмотрите видео, которое автор рекомендует в комментарии к данному комментарию, там он всё объясняет идеально понятно.

  • @VladilenMinin

    @VladilenMinin

    3 жыл бұрын

    Глянь на канале подробный разбор bind 4 способа

  • @GothBoxBoy

    @GothBoxBoy

    7 ай бұрын

    Думаю что код написан правильно т.к. дело не в принимаемых аргументах, нет. Стрелочные ф-ции как и каррируемые могут создавать замыкание, они все же имеют доступ к содержимому родителя (по научному "лексическому окружению родителя"). Замыкание и каррирование - это разные вещи. Карррируемые ф-ции в отличии от стрелочных преобразуют ф-ции с множеством аргументов в последовательность ф-ций с одним аргументом. И спасибо за коммент, узнал что есть каррируемые ф-ции)👍

  • @hasst9261
    @hasst92614 жыл бұрын

    Контентище!

  • @littlepony7160
    @littlepony7160 Жыл бұрын

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

  • @valerian6943
    @valerian69433 жыл бұрын

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

  • @user-br1tu9xh4w
    @user-br1tu9xh4w Жыл бұрын

    Спасибо!

  • @viktorpoliushko2015
    @viktorpoliushko20154 жыл бұрын

    Сколько уже слов было сказано об этом канале, но я не поленюсь и тоже напишу. Очень лаконично и четко, все по полочкам без воды, спасибо за труды. Привіт з України!

  • @VladilenMinin

    @VladilenMinin

    4 жыл бұрын

    Привет с Шри-Ланки)

  • @myroadmalankajosef9192

    @myroadmalankajosef9192

    11 ай бұрын

    та ну нахуй тебе занесло!))) а що там на Шрі Ланці??? Країна третього світу!!! Я б зрозумів, аби ти із Ліхтенштейну привіт передавав, або із Швейцарії)@@VladilenMinin

  • @user-dl2lm7ju2y
    @user-dl2lm7ju2y4 жыл бұрын

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

  • @serious_psychologist
    @serious_psychologist5 жыл бұрын

    но в целом очень нравится, у Вас реально талант объяснять простым языком. Этого сейчас очень мало на ютубе, одно бла бла бла, я понимаю что русский язык позволяет заниматься разглагольствованием, но хочется максимум понятной информации за минимальное время, у Вас пока по тем видео которым я смотрел все так, т.е. можно джуниоров натаскивать по Вашим видео :) все всё поймут. Спасибо еще раз.

  • @VladilenMinin

    @VladilenMinin

    5 жыл бұрын

    Благодарю за отзыв Дело не в языке, а в понимании и умении Те, кто льют воду сами плохо разбираются

  • @user-vs6bg3xn5s
    @user-vs6bg3xn5s4 жыл бұрын

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

  • @VladilenMinin

    @VladilenMinin

    4 жыл бұрын

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

  • @juriskrumgolds5810
    @juriskrumgolds58104 жыл бұрын

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

  • @crn05

    @crn05

    Жыл бұрын

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

  • @eurorock5912
    @eurorock59125 жыл бұрын

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

  • @Max-kr4ie

    @Max-kr4ie

    5 жыл бұрын

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

  • @harrypolygon

    @harrypolygon

    4 жыл бұрын

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

  • @artemijeka
    @artemijeka2 жыл бұрын

    Спасибо

  • @mukhammadrustambayev2051
    @mukhammadrustambayev20515 жыл бұрын

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

  • @parahumanoid
    @parahumanoid2 жыл бұрын

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

  • @MaverickYurii
    @MaverickYurii4 жыл бұрын

    Super vidos)))

  • @dadya_feodor
    @dadya_feodor3 жыл бұрын

    Сделал 2 раза, один раз не понял в чем прикол и сделал через bind. Потом посмотрел как ты решил, понял, что смысл был в том, чтобы не использовать bind. На сл. день сел, написал function bind (context, fn) { return fn.apply(context) } оно работает, и я не понял зачем ещё какие-то аргументы передавать... В общем, было прикольно подумать, но задачка должна быть явно какой-то другой)

  • @ugolblab6940
    @ugolblab69403 жыл бұрын

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

  • @suslikest3708
    @suslikest37085 жыл бұрын

    Лайк!

  • @userneusernouseruser
    @userneusernouseruser4 ай бұрын

    Честно сказать я еще как (trainee), запутался из-за того что функция называется bind, и подумал что ты создаешь новую функцию для метода .bind и вызвав метод можно получится эту функцию, ну примерно как prototype, и только спустя час и долгих раздумий, я понял что это проссссто название функции где там так и было написано «свою функцию bind» Лучше Имена не называть именами методов свойст и так далее для страховки

Келесі