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

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

Вернуться   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,742
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: 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,361
Написано 2,473 полезных сообщений
(для 6,857 пользователей)
Ответ: 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 = {
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 в 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,361
Написано 2,473 полезных сообщений
(для 6,857 пользователей)
Ответ: 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, время: 04:21.


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