Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 02.07.2019, 11:02   #1
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 308
Написано 107 полезных сообщений
(для 228 пользователей)
JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Привет полумертвый родной форум!))) Пытаюсь разобраться в основах Javascript и назрел вопрос. Во многих источниках пишут что замыкания - это одна из фундаментальных концепций js, но везде где пытаюсь разобраться что это такое не могу понять два момента:
1) Почему вместо замыканий нельзя точно так же пользоваться глобальными переменными для тех же задач?
2) Я правильно понял, что замыкания вносят проблемы в работу сборщика мусора, и переменные залипшие в замыкании остаются в памяти на неопределенное время и без возможности удаления.

Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.07.2019, 08:24   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,550
Написано 5,333 полезных сообщений
(для 15,403 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Сообщение от EvilOkta Посмотреть сообщение
Привет полумертвый родной форум!))) Пытаюсь разобраться в основах Javascript и назрел вопрос. Во многих источниках пишут что замыкания - это одна из фундаментальных концепций js, но везде где пытаюсь разобраться что это такое не могу понять два момента:
1) Почему вместо замыканий нельзя точно так же пользоваться глобальными переменными для тех же задач?
2) Я правильно понял, что замыкания вносят проблемы в работу сборщика мусора, и переменные залипшие в замыкании остаются в памяти на неопределенное время и без возможности удаления.

Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?
Помогли бы примеры кода.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (03.07.2019)
Старый 03.07.2019, 09:07   #3
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,175
Написано 2,359 полезных сообщений
(для 6,537 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Сообщение от ABTOMAT Посмотреть сообщение
Помогли бы примеры кода.
Нафига? Вопрос сугубо идеологический.

Все глобалы в js это св-ва суперобъекта window и можно с лёгкостью случайно переопределить уже существующее свойство.

Вот их список:
Object.keys(window
Весь код на js следует дробить на контексты, по выходу из которых сборщик почистит всё, даже перекрёстные ссылки, чего нельзя гарантировать при использовании глобалов.

Про всё подряд можно почитать тут: https://jstherightway.org/
Сборник советов как правильно разрабатывать на js.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 64Gb ram; Nvidia Geforce 1070Ti Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
ABTOMAT (04.07.2019), EvilOkta (03.07.2019), St_AnGer (03.07.2019)
Старый 03.07.2019, 12:40   #4
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 308
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Да, вопрос идеологический, но пример кода приведу. Из урока на хабре
function createCounter() {
   var 
numberOfCalls 0;
   return function() {
      return ++
numberOfCalls;
   }
}
var 
fn createCounter();
fn(); //1
fn(); //2
fn(); //3 
Код который с помощью замыканий вертит каунтером.

Я хоть убейте не могу понять почему не проще завести глобал каунтер и увеличивать его в функции, вместо такой конструкции и самое главное - как я понял замыкание образуется за счет постоянного наличия локальной переменной (в данном коде numberOfCalls ) то в лексическом контексте, то в контексте выполнения, но в таком случае переменная, которая находится в замыкании никогда не будет удалена сборщиком (или нет? не нашел ответа нигде).
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?
В каких случаях замыкания применять полезнее чем другие способы?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.07.2019, 15:15   #5
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,164
Написано 717 полезных сообщений
(для 1,769 пользователей)
Ответ: 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, 15:45   #6
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 308
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Такой код разве не сработает? Или JS имеет ограничения?
PS: я реально не понимаю ))

var fn1 = {
counter0
}
var 
fn2 = {
counter0
}

function 
IncreaseCount(count) {
  return 
count.counter++
}

fn1.counter IncreaseCount(fn1);
fn2.counter IncreaseCount(fn2); 
upd действительно не работает. Т.е. в функции работа идет с копией property...
// ушел читать про замыкания и параметры функций дальше
__________________
Области Хаоса - мой новый Youtube проект

Последний раз редактировалось EvilOkta, 03.07.2019 в 18:54. Причина: проверил код
(Offline)
 
Ответить с цитированием
Старый 04.07.2019, 02:05   #7
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,164
Написано 717 полезных сообщений
(для 1,769 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Да нет же. В твоём примере проблема в том, что ты делаешь постинкремент. То есть ты возвращаешь из функции предыдущее значение счётчика.

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

(function() {
  
// Здесь код
})(); 
Чтобы все используемые переменные не захламляли глобальный контекст.

Кстати сказать, функции являются переменными-объектами. Ты можешь даже свойства им назначать. Например:

function ololo() {
  
console.log(ololo.prop);
}

ololo.prop "OLOLO";

ololo(); 
(Offline)
 
Ответить с цитированием
Старый 04.07.2019, 11:07   #8
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,175
Написано 2,359 полезных сообщений
(для 6,537 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

Сообщение от EvilOkta Посмотреть сообщение
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?
Инкапсуляция какбы. Разделение ответственности, модульность, вот зачем всё это. Да, ты можешь отказаться ото всяких "private"-подобных заморочек и в мелком проекте даже не сложно будет ориентироваться, пока количество связанных частей мало.

Сообщение от EvilOkta Посмотреть сообщение
В каких случаях замыкания применять полезнее чем другие способы?
Во всех. Принял данные внутрь своей процедуры, выдал результат, без затрагивания внешнего контекста и такой луковицей должна быть вся твоя программа. Каждый сабконтекст должен иметь доступ к тому лишь минимуму данных, которые ты сам ему предоставил. Это вопрос не уровня js, а в приницпе про программирование. Приёмы из блица, когда у тебя всё в глобалах остались в блице, там других вариантов зачастую просто не было.
__________________
Retry, Abort, Ignore? █
AMD Ryzen 7 1700X x8 3.4Ghz; 64Gb ram; Nvidia Geforce 1070Ti Radeon RX 570
AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
ABTOMAT (08.07.2019), ant0N (04.07.2019)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 22:14.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com