Я хочу поделиться интересным укомплектованием, который я узнал на закрытиях. Путешествие на этот урок все началось, когда я прокомментировал PR, а автор PR сказал, что добавил дополнительный ()
на функцию Это. HandleToggle.
Как функция была закрытием. Это царапало мой мозг на некоторое время. Я имею в виду, я знал, какие закрытия были или хотя бы идея об этом. Я решил записать его в моей запиской, когда я вернулся к ней позже. Затем я вспомнил, как мой друг рекомендовал, я начну здесь когда смотрите в js. Я быстро пошел на этот репо Github и искал главу о закрытиях. Определение текстового книги я думал, что найду бы, не было там. Тем не менее, Кайл Симпсон использовал примеры и объяснил «Мне, как я 5 лет», я понял концепцию.
Интересный фрагмент кода, который сбил меня с толку, хотя это было
for (var i=1; i<=5; i++) { setTimeout(() => { console.log( i ); }, 100 ); }
который вы можете подумать, распечатываются
1 2 3 4 5
Это на самом деле отпечатывает 6 пять раз на консоли. Попробуй это. Странный ? Не совсем. Я просто хотел увидеть вышеуказанный вывод. Я играл с ним и все еще получил 6 пять раз на консоли. Почему не продолжал читать, потому что я подумал, что знал, что то, что я сразу читал, было достаточно, чтобы попробовать пример петли без чтения дальше. Я даже добавил 0, чтобы придеться время ожидания не иметь никакой задержки. Неудачно! Я продолжил читать книгу Кайла Симпсонов и узнал, что у него было решение этого. Оказывается, что я мог сделать (и многие разработчики) пытался к
Подразумевая, что каждая итерация петли «захватывает» свою собственную копию I, во время итерации. Но, как работает, все 5 из этих функций, хотя они определяются отдельно в каждой итерации петли, все закрыты над тем же общим глобальным объемом, который, на самом деле, только один в нем.
Кайл Симпсон предоставил решение либо с использованием IIFE или SHING ES6 вар
, Пусть
Отказ
используя iife.
for (var i=1; i<=5; i++) { (function(j){ setTimeout(() => { console.log( j ); }, j ); })( i ); }
Использование позволять
for (let i=1; i<=5; i++) { setTimeout(() => { console.log( i ); }, 100 ); }
Я подошел к старшему разработку, и он объяснил только тот же вопрос, который подчеркивает, насколько опасны var
возможно. var
поднимал ценность I и поэтому значение 6 всегда печатается. Что я забыл спросить, это это. Для фрагмента первого кода – это вся цикл работает так, что VAR доходит до 6, а затем выполняет все Settimeouts
позже, а затем отображение 6 как значение i?
Наконец, какие закрытия являются:
Те, кто любит крюк на определение, я сделал маленькую копание и пост Эрика Эллиота, который хорошо объясняет это здесь Отказ
Эрик Эллиот Закрытие - это сочетание функции, объединенной вместе (прилагаемому) со ссылками на его окружающее состояние (лексическая среда). Другими словами, закрытие дает вам доступ к объему внешней функции из внутренней функции.
Я получил доступ к одному из видео Кайла Симпсона, и он объясняет, как следует
Закрытие – это когда функция «запоминает» ее лексическую область, даже если эта функция выполнена хорошо вне ее лексической области.
Я надеюсь, что они имеют смысл и я призываю вас читать больше на «Вы не знаете JS, закрытие» Оставьте интервью JavaScript: что такое закрытие?
Оригинал: “https://dev.to/hawicaesar/no-i-dont-know-what-closures-areyet-568”