Лучшее объяснение закрытия, которое я когда-либо видел, было объяснение механизма. Это произошло примерно так:
Представьте, что ваш программный стек представляет собой вырожденное дерево, в котором у каждого узла есть только один дочерний элемент, а единственный конечный узел является контекстом выполняемой в данный момент процедуры.
Теперь ослабьте ограничение на то, что у каждого узла может быть только один дочерний элемент.
Если вы сделаете это, у вас может быть конструкция ('yield'), которая может возвращаться из процедуры без отбрасывания локального контекста (т. Е. Она не выталкивает ее из стека при возврате). В следующий раз, когда процедура вызывается, вызов выбирает старый кадр стека (дерева) и продолжает выполняться там, где он остановился.