forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JavaScript / HTML (http://forum.boolean.name/forumdisplay.php?f=136)
-   -   JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос)) (http://forum.boolean.name/showthread.php?t=20773)

EvilOkta 02.07.2019 14:02

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

Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?

ABTOMAT 03.07.2019 11:24

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
Цитата:

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

Где можно подробнее изучить этот вопрос? Я понял про лексический контекст выполнения, но не могу понять зачем этот прием использовать, в чем его преимущество перед другими?

Помогли бы примеры кода.

Randomize 03.07.2019 12:07

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
Цитата:

Сообщение от ABTOMAT (Сообщение 316429)
Помогли бы примеры кода.

Нафига? Вопрос сугубо идеологический.

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

Вот их список:
PHP код:

Object.keys(window) 

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

Про всё подряд можно почитать тут: https://jstherightway.org/
Сборник советов как правильно разрабатывать на js.

EvilOkta 03.07.2019 15:40

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
Да, вопрос идеологический, но пример кода приведу. Из урока на хабре
PHP код:

function createCounter() {
   var 
numberOfCalls = 0;
   return function() {
      return ++
numberOfCalls;
   }
}
var 
fn = createCounter();
fn(); //1
fn(); //2
fn(); //3 

Код который с помощью замыканий вертит каунтером.

Я хоть убейте не могу понять почему не проще завести глобал каунтер и увеличивать его в функции, вместо такой конструкции и самое главное - как я понял замыкание образуется за счет постоянного наличия локальной переменной (в данном коде numberOfCalls ) то в лексическом контексте, то в контексте выполнения, но в таком случае переменная, которая находится в замыкании никогда не будет удалена сборщиком (или нет? не нашел ответа нигде).
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?
В каких случаях замыкания применять полезнее чем другие способы?

Phantom 03.07.2019 18:15

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
PHP код:

var fn1 = createCounter(); 
var 
fn2 = createCounter(); 
fn1(); //1 
fn1(); //2 
fn1(); //3  
fn2(); //1 
fn2(); //2 
fn2(); //3 

Как ты сделаешь такое на глобалах?

EvilOkta 03.07.2019 18:45

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

PHP код:

var fn1 = {
counter: 0
}
var 
fn2 = {
counter: 0
}

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

fn1.counter = IncreaseCount(fn1);
fn2.counter = IncreaseCount(fn2); 

upd действительно не работает. Т.е. в функции работа идет с копией property...
// ушел читать про замыкания и параметры функций дальше

Phantom 04.07.2019 05:05

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
Да нет же. В твоём примере проблема в том, что ты делаешь постинкремент. То есть ты возвращаешь из функции предыдущее значение счётчика.

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

PHP код:

(function() {
  
// Здесь код
})(); 

Чтобы все используемые переменные не захламляли глобальный контекст.

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

PHP код:

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

ololo.prop = "OLOLO";

ololo(); 


Randomize 04.07.2019 14:07

Ответ: JS Замыкания vs глобальные переменные vs сборщик мусора (тупой вопрос))
 
Цитата:

Сообщение от EvilOkta (Сообщение 316431)
Идеологически мне не понятен смысл применения замыканий. Если как говорит Randomize - для контекстного деления кода на блоки, и по сути "эмуляции" private переменных так? Или это все словоблудие?

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

Цитата:

Сообщение от EvilOkta (Сообщение 316431)
В каких случаях замыкания применять полезнее чем другие способы?

Во всех. Принял данные внутрь своей процедуры, выдал результат, без затрагивания внешнего контекста и такой луковицей должна быть вся твоя программа. Каждый сабконтекст должен иметь доступ к тому лишь минимуму данных, которые ты сам ему предоставил. Это вопрос не уровня js, а в приницпе про программирование. Приёмы из блица, когда у тебя всё в глобалах остались в блице, там других вариантов зачастую просто не было.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot