Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.11.2018, 02:44
Интересующийся
Отправить личное сообщение для Auroar Посмотреть профиль Найти все сообщения от Auroar
 
Регистрация: 10.04.2018
Сообщений: 10

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

Хочу разобраться, что-то туго пошло, надеюсь на помощь)
Ответить с цитированием
  #2 (permalink)  
Старый 10.11.2018, 02:51
Интересующийся
Отправить личное сообщение для Auroar Посмотреть профиль Найти все сообщения от Auroar
 
Регистрация: 10.04.2018
Сообщений: 10

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

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

Почему так происходит? В JavaScript для очистки памяти используется автоматический сборщик мусора. Т.е. после того как функция отработала, все внутренние переменные, которые были созданы в момент её выполнения автоматически уничтожаются сборщиком мусора и получить доступ к ним уже нельзя. А что если внутри некоторой функции поместить ещё одну функцию и вернуть её в качестве результата. В этом случае случится замыкание, т.к. в JavaScript любая функция имеет ссылку на родительский объект (в данном случае на переменные родительской функции). А пока существует ссылка, сборщик мусора не может уничтожить переменные родительской функции и к ним можно обратиться. Такой приём в JavaScript позволяет внутренней функции сохранять окружение, в котором она создана.
Ответить с цитированием
  #3 (permalink)  
Старый 10.11.2018, 02:54
Интересующийся
Отправить личное сообщение для Auroar Посмотреть профиль Найти все сообщения от Auroar
 
Регистрация: 10.04.2018
Сообщений: 10

А ссылаться означает просто иметь доступ к этим переменным в памяти
Ответить с цитированием
  #4 (permalink)  
Старый 10.11.2018, 03:01
Интересующийся
Отправить личное сообщение для Auroar Посмотреть профиль Найти все сообщения от Auroar
 
Регистрация: 10.04.2018
Сообщений: 10

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

var counter = makeCounter();

var counter2 = makeCounter();

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

alert( counter2() ); // 1

Представим что внутри функции makeCounter есть функция, благодаря этому интерпретатор не может удалить объект LexicalEnvironment этой функции, он хранит его в памяти, но что тогда черт возьми происходит когда мы вызываем еще раз эту функцию, в память помещается еще один такой объект или как вообще??? Тут просто ступор!!!
Ответить с цитированием
  #5 (permalink)  
Старый 10.11.2018, 10:55
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

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

Нужно перечитать учебник и понять как работает сборщик мусора. Когда окружение сохраняется в замыкании а когда такой объект полностью удаляется для этого есть условие =). Использование замыканий это очень мощный инструмент в JS который позволяет гибко и красиво управлять окружением и состоянием объектов.
Ответить с цитированием
  #6 (permalink)  
Старый 10.11.2018, 12:42
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про text и enter Lansaid Events/DOM/Window 8 26.02.2013 19:54
еще один вопрос про кнопки и события f0rzik Общие вопросы Javascript 15 19.01.2013 23:19
Вопрос про change vitaly63 Общие вопросы Javascript 1 24.12.2012 10:50
Глупый вопрос про if then. Irish.Tippler Общие вопросы Javascript 9 26.07.2012 12:32
Вопрос: И опять про offsetLeft... sigurd Общие вопросы Javascript 11 04.10.2010 14:06