![](images/chestnut/misc/left.gif) |
JavaScript / HTML Создание динамической разметки страниц |
02.07.2019, 14:02
|
#1
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Привет полумертвый родной форум!))) Пытаюсь разобраться в основах Javascript и назрел вопрос. Во многих источниках пишут что замыкания - это одна из фундаментальных концепций js, но везде где пытаюсь разобраться что это такое не могу понять два момента:
1) Почему вместо замыканий нельзя точно так же пользоваться глобальными переменными для тех же задач?
2) Я правильно понял, что замыкания вносят проблемы в работу сборщика мусора, и переменные залипшие в замыкании остаются в памяти на неопределенное время и без возможности удаления.
Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?
|
(Offline)
|
|
03.07.2019, 11:24
|
#2
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Сообщение от EvilOkta
Привет полумертвый родной форум!))) Пытаюсь разобраться в основах Javascript и назрел вопрос. Во многих источниках пишут что замыкания - это одна из фундаментальных концепций js, но везде где пытаюсь разобраться что это такое не могу понять два момента:
1) Почему вместо замыканий нельзя точно так же пользоваться глобальными переменными для тех же задач?
2) Я правильно понял, что замыкания вносят проблемы в работу сборщика мусора, и переменные залипшие в замыкании остаются в памяти на неопределенное время и без возможности удаления.
Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?
|
Помогли бы примеры кода.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.07.2019, 12:07
|
#3
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Сообщение от ABTOMAT
Помогли бы примеры кода.
|
Нафига? Вопрос сугубо идеологический.
Все глобалы в js это св-ва суперобъекта window и можно с лёгкостью случайно переопределить уже существующее свойство.
Вот их список:
Весь код на js следует дробить на контексты, по выходу из которых сборщик почистит всё, даже перекрёстные ссылки, чего нельзя гарантировать при использовании глобалов.
Про всё подряд можно почитать тут: https://jstherightway.org/
Сборник советов как правильно разрабатывать на js.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
|
|
03.07.2019, 15:40
|
#4
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Да, вопрос идеологический, но пример кода приведу. Из урока на хабре
function createCounter() { var numberOfCalls = 0; return function() { return ++numberOfCalls; } } var fn = createCounter(); fn(); //1 fn(); //2 fn(); //3
Код который с помощью замыканий вертит каунтером.
Я хоть убейте не могу понять почему не проще завести глобал каунтер и увеличивать его в функции, вместо такой конструкции и самое главное - как я понял замыкание образуется за счет постоянного наличия локальной переменной (в данном коде numberOfCalls ) то в лексическом контексте, то в контексте выполнения, но в таком случае переменная, которая находится в замыкании никогда не будет удалена сборщиком (или нет? не нашел ответа нигде).
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?
В каких случаях замыкания применять полезнее чем другие способы?
|
(Offline)
|
|
03.07.2019, 18:15
|
#5
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
var fn1 = createCounter(); var fn2 = createCounter(); fn1(); //1 fn1(); //2 fn1(); //3 fn2(); //1 fn2(); //2 fn2(); //3
Как ты сделаешь такое на глобалах?
|
(Offline)
|
|
03.07.2019, 18:45
|
#6
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Такой код разве не сработает? Или JS имеет ограничения?
PS: я реально не понимаю ))
var fn1 = { counter: 0 } var fn2 = { counter: 0 }
function IncreaseCount(count) { return count.counter++ }
fn1.counter = IncreaseCount(fn1); fn2.counter = IncreaseCount(fn2);
upd действительно не работает. Т.е. в функции работа идет с копией property...
// ушел читать про замыкания и параметры функций дальше
Последний раз редактировалось EvilOkta, 03.07.2019 в 21:54.
Причина: проверил код
|
(Offline)
|
|
04.07.2019, 05:05
|
#7
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Да нет же. В твоём примере проблема в том, что ты делаешь постинкремент. То есть ты возвращаешь из функции предыдущее значение счётчика.
В общем глобальные переменные не нужно использовать хотя бы по той же причине, по которой это осуждается в других языках. Я, например, любой используемый код на html страницах оборачиваю в:
(function() { // Здесь код })();
Чтобы все используемые переменные не захламляли глобальный контекст.
Кстати сказать, функции являются переменными-объектами. Ты можешь даже свойства им назначать. Например:
function ololo() { console.log(ololo.prop); }
ololo.prop = "OLOLO";
ololo();
|
(Offline)
|
|
04.07.2019, 14:07
|
#8
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
Сообщение от EvilOkta
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?
|
Инкапсуляция какбы. Разделение ответственности, модульность, вот зачем всё это. Да, ты можешь отказаться ото всяких "private"-подобных заморочек и в мелком проекте даже не сложно будет ориентироваться, пока количество связанных частей мало.
Сообщение от EvilOkta
В каких случаях замыкания применять полезнее чем другие способы?
|
Во всех. Принял данные внутрь своей процедуры, выдал результат, без затрагивания внешнего контекста и такой луковицей должна быть вся твоя программа. Каждый сабконтекст должен иметь доступ к тому лишь минимуму данных, которые ты сам ему предоставил. Это вопрос не уровня js, а в приницпе про программирование. Приёмы из блица, когда у тебя всё в глобалах остались в блице, там других вариантов зачастую просто не было.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:44.
|