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

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

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

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

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

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

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

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

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

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

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

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

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

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

Про всё подряд можно почитать тут: https://jstherightway.org/
Сборник советов как правильно разрабатывать на js.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 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 за это полезное сообщение:
ABTOMAT (04.07.2019), EvilOkta (03.07.2019), St_AnGer (03.07.2019)
Старый 03.07.2019, 15:40   #4
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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 переменных так? Или это все словоблудие?
В каких случаях замыкания применять полезнее чем другие способы?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.07.2019, 18:15   #5
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 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
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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...
// ушел читать про замыкания и параметры функций дальше
__________________
Области Хаоса - мой новый Youtube проект

Последний раз редактировалось EvilOkta, 03.07.2019 в 21:54. Причина: проверил код
(Offline)
 
Ответить с цитированием
Старый 04.07.2019, 05:05   #7
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 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
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,374
Написано 2,478 полезных сообщений
(для 6,866 пользователей)
Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))

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

Сообщение от EvilOkta Посмотреть сообщение
В каких случаях замыкания применять полезнее чем другие способы?
Во всех. Принял данные внутрь своей процедуры, выдал результат, без затрагивания внешнего контекста и такой луковицей должна быть вся твоя программа. Каждый сабконтекст должен иметь доступ к тому лишь минимуму данных, которые ты сам ему предоставил. Это вопрос не уровня js, а в приницпе про программирование. Приёмы из блица, когда у тебя всё в глобалах остались в блице, там других вариантов зачастую просто не было.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 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 за это полезное сообщение:
ABTOMAT (09.07.2019), ant0N (04.07.2019)
Ответ


Опции темы

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

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


Часовой пояс GMT +4, время: 20:48.


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