Это очень хорошая статья.
https://dmitryfrank.com/articles/js_closures
Scope цепь
Если какой-либо код JavaScript выполняется, он нуждается в какое-то место для хранения своих локальных переменных. Назовем это место объектом области (некоторые относятся к нему как к LexicalEnvironment). Например, когда вы вызываете какую-либо функцию, а функция определяет локальные переменные, эти переменные сохраняются в объекте области видимости. Вы можете думать об этом как о обычном JavaScript-объекте с заметной разницей, что вы не можете напрямую ссылаться на весь объект. Вы можете изменять только его свойства, но вы не можете ссылаться на сам объект области видимости.
Эта концепция объекта области видимости сильно отличается от, скажем, C или C++, где локальные переменные хранятся в стеке. В JavaScript объекты области назначения выделяются в куче вместо (или, по крайней мере, ведут себя так), поэтому они могут оставаться выделенными, даже если функция уже возвращена. Об этом позже.
Как и следовало ожидать, область объекта может иметь родительский элемент. Когда код пытается получить доступ к некоторой переменной, интерпретатор ищет свойство текущего объекта области видимости. Если свойство не существует, интерпретатор перемещается к объекту родительской области и просматривает его. И так далее, пока значение не будет найдено, или нет родителя. Давайте назовем эту последовательность объектов области видимости как цепочку областей видимости.
Поведение решения переменной по цепочке областей видимости очень похоже на поведение прототипального наследования, опять же, одно заметное различие: если вы пытаетесь получить доступ к некоторому несуществующему свойству обычного объекта, а цепочка прототипов не это свойство тоже, это не ошибка: undefined молча возвращается. Но если вы попытаетесь получить доступ к несуществующему свойству в цепочке областей видимости (т. Е. Получить доступ к несуществующей переменной), произойдет сбой ReferenceError.
* «Но в закрытии внутренней функции по-прежнему будет доступ к состоянию функции Enclosing, как?» * Это детали реализации, и разные механизмы могут делать это по-другому, но среда (которая содержит привязки), вероятно, хранится в куче. –
@FelixKling спасибо за ур ответ. У меня есть еще несколько вопросов, например: где функции и объекты находятся в Javascript? Dint найти любую помощь в Интернете. У вас есть какие-либо ресурсы, которые бросают больше света на распределение и управление памятью в JS? – BeingSuman