2017-02-22 3 views
1

Поняв основы Closures Существует один сомнений, что все еще преследует меня:Куда включена функция включения после выполнения ее выполнения или после возврата функции закрытия?

Где ограждающих функции находятся размещать ее выполнения или после возвращения функции закрытия?

Я считаю, что функции находятся в структуре данных стека и сбиты с вершины стека, когда функция завершает свое выполнение/возвращает любое значение.

Но в закрытии внутренней функции по-прежнему будет доступ к состоянию функции Enclosing, как?

function sayHello(name) { 
    var text = name + ' !!!'; // Local variable 
    return function(wish) { console.log(wish + ', ' +text); } 
} 

var say = sayHello('Bob'); 

say('Hey'); 
say('Hello'); 

Где sayHello присутствует как только он возвращает функцию, как его удалить из кадра стека функции?

+2

* «Но в закрытии внутренней функции по-прежнему будет доступ к состоянию функции Enclosing, как?» * Это детали реализации, и разные механизмы могут делать это по-другому, но среда (которая содержит привязки), вероятно, хранится в куче. –

+0

@FelixKling спасибо за ур ответ. У меня есть еще несколько вопросов, например: где функции и объекты находятся в Javascript? Dint найти любую помощь в Интернете. У вас есть какие-либо ресурсы, которые бросают больше света на распределение и управление памятью в JS? – BeingSuman

ответ

1

Это очень хорошая статья.

https://dmitryfrank.com/articles/js_closures

Scope цепь

Если какой-либо код JavaScript выполняется, он нуждается в какое-то место для хранения своих локальных переменных. Назовем это место объектом области (некоторые относятся к нему как к LexicalEnvironment). Например, когда вы вызываете какую-либо функцию, а функция определяет локальные переменные, эти переменные сохраняются в объекте области видимости. Вы можете думать об этом как о обычном JavaScript-объекте с заметной разницей, что вы не можете напрямую ссылаться на весь объект. Вы можете изменять только его свойства, но вы не можете ссылаться на сам объект области видимости.

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

Как и следовало ожидать, область объекта может иметь родительский элемент. Когда код пытается получить доступ к некоторой переменной, интерпретатор ищет свойство текущего объекта области видимости. Если свойство не существует, интерпретатор перемещается к объекту родительской области и просматривает его. И так далее, пока значение не будет найдено, или нет родителя. Давайте назовем эту последовательность объектов области видимости как цепочку областей видимости.

Поведение решения переменной по цепочке областей видимости очень похоже на поведение прототипального наследования, опять же, одно заметное различие: если вы пытаетесь получить доступ к некоторому несуществующему свойству обычного объекта, а цепочка прототипов не это свойство тоже, это не ошибка: undefined молча возвращается. Но если вы попытаетесь получить доступ к несуществующему свойству в цепочке областей видимости (т. Е. Получить доступ к несуществующей переменной), произойдет сбой ReferenceError.