Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос про Scope и LexicalEnvironment (https://javascript.ru/forum/misc/75829-vopros-pro-scope-i-lexicalenvironment.html)

Auroar 10.11.2018 02:44

Вопрос про Scope и LexicalEnvironment
 
Каким образом свойство Scope ссылается на свое окружение(LexicalEnvironment)? Что именно подразумевается под словом ссылается?? Это окружение записывается как значение в свойство Scope или как? И как работает замыкание (возможность функции обращаться к внешним переменным) если при завершении выполнения внешней функции ее объект LexicalEnvironment (внешние переменные) удаляется?

Хочу разобраться, что-то туго пошло, надеюсь на помощь):p

Auroar 10.11.2018 02:51

Нашел ответ на свой вопрос, и он просто шикарен!!!

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

Почему так происходит? В JavaScript для очистки памяти используется автоматический сборщик мусора. Т.е. после того как функция отработала, все внутренние переменные, которые были созданы в момент её выполнения автоматически уничтожаются сборщиком мусора и получить доступ к ним уже нельзя. А что если внутри некоторой функции поместить ещё одну функцию и вернуть её в качестве результата. В этом случае случится замыкание, т.к. в JavaScript любая функция имеет ссылку на родительский объект (в данном случае на переменные родительской функции). А пока существует ссылка, сборщик мусора не может уничтожить переменные родительской функции и к ним можно обратиться. Такой приём в JavaScript позволяет внутренней функции сохранять окружение, в котором она создана.

Auroar 10.11.2018 02:54

А ссылаться означает просто иметь доступ к этим переменным в памяти

Auroar 10.11.2018 03:01

НО ВОПРОС ВСЕ ТАКИ ЕСТЬ!

var counter = makeCounter();

var counter2 = makeCounter();

alert( counter() ); // 1
alert( counter() ); // 2
alert( counter() ); // 3

alert( counter2() ); // 1

Представим что внутри функции makeCounter есть функция, благодаря этому интерпретатор не может удалить объект LexicalEnvironment этой функции, он хранит его в памяти, но что тогда черт возьми происходит когда мы вызываем еще раз эту функцию, в память помещается еще один такой объект или как вообще??? Тут просто ступор!!!

MallSerg 10.11.2018 10:55

Цитата:

Сообщение от Auroar
Представим что внутри функции makeCounter есть функция, благодаря этому интерпретатор не может удалить объект

Не верно среда исполнения вполне может удалить такую функцию даже если внутри будет сколько угодно функций.

Нужно перечитать учебник и понять как работает сборщик мусора. Когда окружение сохраняется в замыкании а когда такой объект полностью удаляется для этого есть условие =). Использование замыканий это очень мощный инструмент в JS который позволяет гибко и красиво управлять окружением и состоянием объектов.

Aetae 10.11.2018 12:42

Auroar, да помещается ещё один объект. Каждый вызов функции создаёт своё окружение внутри этой функции, по-моему очевидно же?


Часовой пояс GMT +3, время: 09:43.