Замыкания в JavaScript | Юрий Федоренко
HTML-код
- Опубликовано: 27 сен 2024
- Замыкания - одна из самых мощных особенностей JavaScript, без них ни туда, ни сюда.
Это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт вам доступ к Scope внешней функции из внутренней функции. В JavaScript замыкания создаются каждый раз при создании функции, во время её создания.
Про то что такое Замыкание в Джаваскрипте, рассказывает Senior Software Developer Юрий Федоренко.
Подписывайтесь на телеграм-канал t.me/callforward
Компьютерная Школа Hillel
site: ithillel.ua
fb: / hillel.it.school
in: / hillel_itschool
tw: / hillel_itschool
ln: / hillel_itschool
yt: / hillelitschool
#javascript #frontend #js #замыкания #прототипы
так объяснял что сам понял - тру стори
Такие видюшки помогают быстро освежить знания перед собеседованиями) жаль что их так мало
Это гениальное объяснение замыканий! И правда легонько и не навячиво. Спасибо!
Спасибо Юра за твои хоть и не большие, но все таки понятные изложения. Ждем-с новые твои выпуски по JS.
Спасибо, все гораздо проще чем мне казалось. Главное что помогли поменять, так это способы применения.
Раді, що були корисні 💙
Великолепное объяснение. Закрыл пробелы и всё понял с первого раза.
Юра, продолжайте, умоляю ))
Юра, ты крут! Спасибо за видео
И заслуживает лайка бро. Как же круто рассказал. Поклон, низкий, бью челом
Мне пришлось несколько раз внимательно прослушать - но в итоге я все поняла! Огромное спасибо!
Спасибо Родной!!!! Ты лучший:))))
Подпишусь, может побольше будет таких мини-ликбезов. Перед сном самое то)))
Редко пишу комментарии, но за такое хорошее видео, грех не написать!) Спасибо вам.
Спасибо, только теперь разобрался
мне не перезвонили
На этом видео понял тему! спасибо за помощь
Рады, что были полезны )
Очень хорошее видео! Благодарю)
Я уже раз 10 посмотрел видео про this и прототипы - обожаю его. И вот подъехал потенциальный новый фаворит.)
Это какое?
ruclips.net/video/0vs6WkNyzec/видео.html&list=LLeXZ31bUXjUlXgMibPcrkCw&index=18
благодарю
какой же милый лектор
Бро. Спасибо Бро. Ты настроящий Бро, Бро
спасибо)
2019 на дворе, а видео про асинхронность так нет(((
2020 и тоже нет(
@@CozyAvocados и в 2021 не будет(
Уже 2 января 2021!
Ишо нЭт! )))
Спасибо большое !! Есть просьба сделать серию уроков ES6-7
Лайк не глядя 🤣 Лучший учитель 👍👍👍👍
Фантастика, нарешті)
А я думал замыкание это что то космическое. Видите от препода многое зависить. Многие просто не умеют передавать свои знания и еще больше запутывает студента. А некоторые вот так просто человеческим языком доступно делают.
Спасибо! Очень доступно объяснил)
2020((( а мы ещё ждём!)))
Круто!
Спасибо за Ваш труд))
Дякую за відео , все сподобалось ))
Спасибо!
Пример с счетчиком очень полезный
Спасибо. Прочел в книге Выразительный js о замыканиях но не понял, а здесь все очень понятно.
почитай снова, здесь он путает.... один палец с другим.
🔥
Бен Аффлек в JS))
замыкания - интересная и иногда полезная техника, но никак не необходимая
без них и туда и сюда
кстати, для замыкания не обязательно возвращать одну функцию из другой, можно положить ее в память любым способом, например, связать ее со слушателем событий
Объясняешь просто супер. Музыку приложите в описание.
👍
Я вот чего не понял только. Мы вызываем ту анонимную функцию, которая возвращает увеличенное значение переменной count, которое хранится в "родительской функции" Counter. Тут всё понятно, но! Допустим, мы отдельно вызовем родительскую функцию Counter, которая по идее должна обнулить переменную count (и она делает это, что показывается при дебаге), но дальнейшие вызовы анонимной функции через count() показывают, что переменная не обнулялась. Как так происходит? Новый вызов родительской Counter() создаёт новую область видимости с новой переменной, в то время как counter продолжает работать в старой со своей переменной, так получается?
console.log(counter()); // 1
console.log(counter()); // 2
Counter();
console.log(counter()); // 3
console.log(counter()); // 4
ее вызов ничего не обнуляет, ее вызов создает новую область видимости
в вашем коде результат вызова Counter(); никуда не сохраняется и порожденный новый счетчик как бы теряется)
я это объясняю на 4:52
@@yurafedorenko1218 повторил код на 4:10 и возвращает не цифры, а тело родительской функции. Почему так?
@@user-zd6tt5by9z ну он возращает функцию, а вот когда ее вызывать, то будут числа
@@yurafedorenko1218 а как ее правильно вызвать?
@@user-zd6tt5by9z ну типа:
var firstCounter = Counter();
var secondCounter = Counter();
console.log( firstCounter() ); // 1
console.log( firstCounter() ); // 2
console.log( firstCounter() ); // 3
console.log( secondCounter() ); // 1
console.log( secondCounter() ); // 2
console.log( firstCounter() ); // 4
господи, я не дабстеп слушать сюда зашел (звук на колонках), подубавьте басы
супер
Вот функция в функции сложнее даётся , че то видимо надо пересматривать
Юра, тему промисов бы поднять) Еще requestAnimationFrame.
Что-то недогнал. Разные счетчики при вызове новой функции пытаются получить разные данные из одни и тех же переменных 🤔?
привет! выпусти урок по асинхронности пожалуйста! Ты же обещал!
я не обещал когда оно будет, но в этом году точно)
На дворе уже 20-й, а про асинхронность ни слова..)
Никто так и не написал, что у вас в комментариях ошибка. При первом вызове она выдаст 0, а не 1. Потому что в коде используется не ++counter, a counter++
Или так:
const makeCounter = () => {
let count = 0;
const foo = () => count++;
return foo;
};
let counter = makeCounter();
let anothercounter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(anothercounter()); // 0
Юра, а как там дела с асинхронностью обстоят?
Можно ли сказать, что замыкание это функция внутри функции. Как я понял это один из вариантов ответа на вопрос: "Что такое замыкание?"
Я бы на собесе ответил так : замыкание - это вызов функции с помощью другой функции)))))
короче говоря, в джава скрипт замыкание это как в питоне локальные перемённые.
Несколько часов пытаюсь понять эту тему, почему в теме о замыкании на общеизвестном сайте learn.javascript.ru в примере со счетчиками нигде не объясняется, почему счетчик в случае замыкания увеличивается. Решил посмотреть видео, чтобы услышать альтернативное видение. Как результат: в данном видео тупо рассказывают сокращенную версию статьи вышеуказанного сайта, код совпадает до мельчайших подробностей, прям выдран с сайта. При этом никто даже не пытается объяснить, почему увеличивается счетчик. Так не делается. Тема не раскрыта, дизлайк.
У меня наоборот. Читал на лерн.джавасрипт.ру и ничего не понял (или только частично) а вот это видео внесло полную ясность.
@@ДомДляТебя это конечно хорошо) так почему же увеличивается счётчик, расскажи нам всем) я например уже понял, и конечно отпишусь, если непонятно кому-то)
@Alex Reyder задайте конкретный вопрос, иначе мне не ясно, что вам непонятно
@Alex Reyder Замыкание в моем понимании - это явление, сущность, проявляющаяся, когда функция (назовем её «внешней») возвращает в качестве значения другую функцию («внутреннюю»). В таком случая внутренняя имеет доступ к внешней по области видимости, даже после того, как внешняя прекратилась. Это говорит о том, что замыкание может запоминать и получать доступ к чтению и изменению переменных и аргументов своей внешней функции, даже после того, как та прекратит выполнение. Если на пальцах, почему увеличивается счетчик: в момент вызова (исполнения) функции Counter создается объект Lexical Environment и возвращается внутренняя функция, которая записывается в переменную counter. В этой внутренней функции есть скрытое свойство [[Scope]], которое указывает на этот объект LE внешней функции. Т.к. мы эту переменную можем использовать в любой момент, сборщик мусора не удаляет LE внешней функции. При этом доступ к этому объекту остается только у внутренней функции. Мы можем читать и изменять переменные в этом объекте, что мы и делаем. При этом, учитывая, что это объект, при чтении мы всегда будем получать текущее значение. Вот и всё)
Ты, блять, слепой? После переменной стоит ++ т.е увеличивается на 1.
посмотрел время видео - захотел диз влепить, но решил глянуть...нормально объяснил, лаконично. Функцию стрелкА, конечно не трогал, но все гглавные аспекты объяснены. Спасибо.
что нельзя просто сказать что переменная а читаема функцией но не изменяема а переменная б читаема и изменяема функцией но не видима другими функциями и програмой !?
ааааа
Слабенькое объяснение. Почти 7 минут бреда.. Кто хочет понять замыкание смотрите - ruclips.net/video/pahO5XjnfLA/видео.html
Да ни хрена не понятно....
Ну зачем делать ещё одно стандартное видео по данной теме, которое повторяет информацию десятков других источников. Ничего нового. Почему бы не рассказать зачем именно нужны замыкания? Нет, не то, что было показано в видео, а действительно зачем они нужны, в первичной их сути. Почему ни слова о фунарг проблеме? Такое чувство, что автор хапнул базовых знаний и так и остался на этом видении картины замыканий. И видео лишь для галочки на канале. Буду рад ответу и объяснению, почему видео не касается этих вопросов. Если ответа не последует, тогда будет ясно, что вы не особо хорошо относитесь к своей аудитории, игнорируя подобные вопросы.
:D
Юрий, ну я серьезно, почему? Это не троллинг, не попытка задеть и прочее.
В общем, ответа не будет?
Виктор Данилов я понимаю, что это не тролинг, но я правда не знаю что ответить( ваш вопрос это претензия к автору школьного учебника по математике, что он плохо раскрыл тему интегралов. Я признаю - плохо. Но это просто такой формат, я пытаюсь простыми словами объяснять вещи так, чтоб это было понятно без специальной подготовки.
А ваши пассажи насчет моего отношения к аудитории - нелепые. Мое отношение к аудитории в том, что я делаю. И вы как человек который и сам что-то снимал для ютуба можете оценить сколько сил и ресурсов здесь вложено в продакшн. И вот на этом фоне появляется человек в комментах который пишет несколько предложений и резюмирует: если не ответите то вам на всех плевать. Не надо так.
Очень рад, что вы ответили. Да эти все фразы были только для того, чтобы поднять важность моего ожидания ответа. Просто предположил, что это очередной канал, в котором на комментарии не отвечают, а ответа мне очень хотелось. Извините, если что. Хорошо, условились, что это видео для начинающих. А будет ли что-то для продвинутого уровня в будущем? Просто контента для начинающих тонны просто уже. Зачем снимать то, что уже есть. Это ведь основным принципом должно быть. Просто интересно, задаётесь ли вы вопросом о том что "я только что снял то, что уже есть. Почему моё объяснение лучше, чем у других? В чём оригинальность моего видео?" И вложения сил, в первую очередь, понимаю и уважаю. Но просто если опять мусолить тему замыканий на начинающем уровне, то хотя бы сделать это.. ну как-то оригинально, что ли. Да хоть пример со счётчиком этот взять. Ну было ведь, и причём не у одного объясняющего. Поймите, я очень-очень редко оставляю комментарии, но в этот раз решил написать, чтобы просто узнать ваше мнение о вашей осознанности касательно вопроса "Зачем я создаю то, что уже есть итак? В чём ценность этого?"
Народ, за что вы лижите автору? Он не раскрыл замыкания в js, он не сказал как работают функции, почему они являются объектами и тд. Он тупо процитировал learn.javascript.ru. Они даже не удосужились привести нормальный пример. Ужас..
Vladislav Shevlyakov это такой формат когда берется тема и я пытаюсь ее объяснить по-простому, вот и всё
Yura Fedoreko, ну да, а потом приходят «по-простому» такие на роботу, а там их ...
ну по такой логике js нужно начинать учить с ассемблера, я как бы не против, но моя позиция такая: лучше разобраться в чем-то по книжке "для чайников" чем прочитать кнута и ничего не понять
Лучше научится водить в gta, чем идти в автошколу и ничего не понять! И книги Кнута не совсем тут уместны 🙃
Привет, не мог бы подсказать с чего начать новичку, что бы поглубже вникнуть в работу javascript и его ньюансы... Сам сейчас прохожу гайд от MDN, а после планирую почитать Фленегана
Юра, где же видео про асинхронность?
спасибо!!
уже дня 3 пытаюсь разобраться в этой теме, что зачем и как, а тут посмотрел данное видео, и за 15 мин понял что оно такое)) спасибо автору!) лайк однозначно!)
Классический случай.
Можно этот пример переписать в одну строку const Counter = (count = 0) => () => ++count, но тогда не так понятно конечно, без привычки.
я бы сказал так: "Замыкание - это снэпшот всех доступных fункции переменных в момент ее создания"
Очень просто и понятно объясняется, отличное видео!
Рок
а теперь точно также но про промисы
Лексическое окружение функции это не контекст того, где она объявлена. Согласно спецификации, лексическое окружение функции создается во время выполнения этой функции, а замыкание образовывается в момент создания объекта функции, при чём если создавать объект функции с помощью синтаксиса new Function, он будет ссылаться на глобальное лексическое окружение.
Для создания изолированной переменной не обязательно возвращать функцию, это можно сделать так:
var counter;
function makeCounter() {
var сount = 0;
counter = function() {
return ++сount;
}
}
makeCounter();
counter(); //вернёт 1
counter(); //вернёт 2
или так:
{
let count = 0;
function counter() {
return ++count;
}
}
counter(); //вернёт 1
counter(); //вернёт 2
да, все так, там имелось ввиду внешнее лексическое окружение, вообще эти термины часто путают, я даже делал вот тут разбор - ruclips.net/video/HsXKiKNdeTI/видео.html (ссылка с тайм-меткой) но это видео было бы сильно перегруженным если бы прямо в нем это разобрать(
@@yurafedorenko1218 Интересное видео, хотя говоря про способы вызова функций в контексте this, Вы не упомянули о стрелочных функциях, но это не столь существенно. Хотя выходит, что this зависит не только от способа вызова функции но и от ее типа.
Относительно нынешнего видео, мне кажется, что прежде всего надо говорить о том, что в среде разработчиков JS существуют три определения термина "замыкание". Первое, самое верное, которое соответствует определению для всех языков программирования - замыкание это сочетание функции и её внешнего лексического окружения. Второе - это сочетание функции и свободных переменных, которые она использует. Третье - это сочетание функции и изолированных переменных, которые она использует, при чем функция может использовать изолированные переменные из нескольких лексических окружений. Иногда замыканием называют только одну из составляющих определения, то есть или саму функцию, или сами переменные или лексическое окружение.
Что касается первого определения, еще существует немного другая версия - замыкание это сочетание функции и её родительского лексического окружения, то есть того, в котором она была определена, но тут появляется проблема в случае синтаксиса new Function. К тому же коректнее говорить о лексическом окружении кода, в котором она была определена.
Теоретически второе определение тоже соответсвует определению замыкания для всех языков программирования. Можно сказать, что первое более абстрактное и основанное на спецификации, а второе более простое и основанное на практике, при чём они отличаются друг от друга, ведь свободные переменные могут находиться не только во внешнем лексическом окружении.
Я еще раз проверил разные определения этого термина, относительно других языков и в целом. Получается, что второе определение, то есть "сочетание функции и свободных переменных, которые она использует" и есть самым правильным. Возвращаясь к видео, то что Вы имели в виду это конечно хорошо знать, но Вы ведь сказали другое, значит ошиблись, то есть вводите людей в заблуждение. Надо бы это исправить, а то получается как-то нехорошо.
Тут вот еще одно видео live.ithillel.ua/javascript-funkcii-oblasti-vidimosti-zamykanie от вашей школы с другой версией определения, насколько я понял основанной на том, что показывает браузер.
var же делает переменую глобальной?
да, но если переменная объявленная при помощи var лежит в функции (проще говоря, в блоке кода {}), то у этой переменной область видимости становится блочной, функциональной). а вообще используйте const :)
дякую, реально допомогло!
Раді, що були корисні!
Можно сказать, что функция counter - это фабрика счётчиков, только порождает эта фабрика функции
Вроде и до этого понятно было, но как послушала, поняла, что только сейчас и поняла))))😁
Спасибо, очень доступно обьяснили)
вот только теперь я понял замыкания) спасибо)
Раді, що стали в нагоді!
Толково объяснил. Спасибо!
Просто супер, спасибо большое)