www.boolean.name

www.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 = {
counter0
}
var 
fn2 = {
counter0
}

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, время: 05:37.

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