Добро пожаловать в следующую статью моих заметок по JavaScript.
В этой статье мы поговорим о: функциях, IIFE, замыканиях
Все содержание взято из замечательного курса Йонаса Шмедтманна Полный курс JavaScript 2022: от нуля до эксперта!
Пожалуйста, купите курс, чтобы понять его содержание, это просто мои краткие заметки о курсе.
Немедленно вызываемые функциональные выражения (IIFE)
(function () { console.log(‘This function will never run again’); })();
здесь важны 2 вещи
- Мы должны сделать оператор IIFE внутри круглых скобок, иначе выдается ошибка
- Мы должны вызвать его сразу после создания, иначе мы не сможем вызвать его снова.
Он также имеет версию со стрелкой.
(() => console.log(‘This function ALSO will never run again’))();
Остерегайтесь скобок
Так зачем нам этот IIFE? Нам это нужно, потому что это помогает инкапсулировать данные и конфиденциальность данных.
Закрытия
Здесь происходит забавная вещь. Несмотря на то, что мы ушли из функции secureBooking, возвращаемая ею функция может получить доступ к своей переменной и увеличить ее? ВТФ верно?
ЛЮБАЯ ФУНКЦИЯ ВСЕГДА ИМЕЕТ ДОСТУП К ПЕРЕМЕННОЙ СРЕДЕ КОНТЕКСТА ВЫПОЛНЕНИЯ, В КОТОРОМ ФУНКЦИЯ СОЗДАНА.
Эта связь называется замыканием
Мы можем использовать console.dir для созданной нами анонимной функции.
Вот некоторые свойства анонимной функции
Те, что с двойными квадратными скобками, — это внутренние структуры, до которых мы не можем добраться. В свойстве scopes мы видим замыкание.
let f; const c = function () { const a = 23; f = function () { console.log(a * 2); }; }; c(); f();
Сумасшествие здесь заключается в том, что даже если функция c покидает стек вызовов JS-движка со своими переменными, f все еще может получить доступ к своему содержимому и использовать его, и она даже не определена в c и не возвращается им.
const boardPassengers = (n, wait) => { const perGroup = n / 3; setTimeout(function () { console.log(`We are now boarding all ${n} passengers`); console.log(`We will accept them in ${perGroup} person groups`); }); console.log(`We will start boarding in ${wait} seconds`); }; boardPassengers(30, 2);
Это еще один пример закрытия, несмотря на то, что функция boardPassengers покидает стек вызовов, наша функция внутри setTimeout может получить доступ к своим переменным.
Посмотрите первую статью в этой ветке js notes!
См. предыдущую статью этой ветки js notes!
См. следующую статью в этой ветке js notes!
Подпишитесь на меня в Твиттере, чтобы не пропустить интересный контент😘
Почитайте обо мне и многих других замечательных технических блоггерах в разделе Dev Genius»