Вопрос про Scope и LexicalEnvironment
Каким образом свойство Scope ссылается на свое окружение(LexicalEnvironment)? Что именно подразумевается под словом ссылается?? Это окружение записывается как значение в свойство Scope или как? И как работает замыкание (возможность функции обращаться к внешним переменным) если при завершении выполнения внешней функции ее объект LexicalEnvironment (внешние переменные) удаляется?
Хочу разобраться, что-то туго пошло, надеюсь на помощь):p |
Нашел ответ на свой вопрос, и он просто шикарен!!!
В JavaScript под замыканием понимается внутренняя функция, которая будет возвращена в результате выполнения родительской функции. Но в замыкании интересно не это, а то, что внутренняя функция имеет доступ к переменным родительской функции, даже если она завершила своё выполнение. Почему так происходит? В JavaScript для очистки памяти используется автоматический сборщик мусора. Т.е. после того как функция отработала, все внутренние переменные, которые были созданы в момент её выполнения автоматически уничтожаются сборщиком мусора и получить доступ к ним уже нельзя. А что если внутри некоторой функции поместить ещё одну функцию и вернуть её в качестве результата. В этом случае случится замыкание, т.к. в JavaScript любая функция имеет ссылку на родительский объект (в данном случае на переменные родительской функции). А пока существует ссылка, сборщик мусора не может уничтожить переменные родительской функции и к ним можно обратиться. Такой приём в JavaScript позволяет внутренней функции сохранять окружение, в котором она создана. |
А ссылаться означает просто иметь доступ к этим переменным в памяти
|
НО ВОПРОС ВСЕ ТАКИ ЕСТЬ!
var counter = makeCounter(); var counter2 = makeCounter(); alert( counter() ); // 1 alert( counter() ); // 2 alert( counter() ); // 3 alert( counter2() ); // 1 Представим что внутри функции makeCounter есть функция, благодаря этому интерпретатор не может удалить объект LexicalEnvironment этой функции, он хранит его в памяти, но что тогда черт возьми происходит когда мы вызываем еще раз эту функцию, в память помещается еще один такой объект или как вообще??? Тут просто ступор!!! |
Цитата:
Нужно перечитать учебник и понять как работает сборщик мусора. Когда окружение сохраняется в замыкании а когда такой объект полностью удаляется для этого есть условие =). Использование замыканий это очень мощный инструмент в JS который позволяет гибко и красиво управлять окружением и состоянием объектов. |
Auroar, да помещается ещё один объект. Каждый вызов функции создаёт своё окружение внутри этой функции, по-моему очевидно же?
|
Часовой пояс GMT +3, время: 09:43. |