Все переменные внутри функции – это свойства специального внутреннего объекта LexicalEnvironment
, который создаётся при её запуске. В отличие от window, объект LexicalEnvironment является внутренним, он скрыт от прямого доступа.
Интерпретатор, при доступе к переменной, сначала пытается найти переменную в текущем LexicalEnvironment, а затем, если её нет – ищет во внешнем объекте переменных.
Замыкание – это функция вместе со всеми внешними переменными, которые ей доступны.
Обычно, говоря «замыкание функции», подразумевают не саму эту функцию, а именно внешние переменные. Иногда говорят «переменная берётся из замыкания». Это означает – из внешнего объекта переменных.
var x = 10;
function foo() {
var y = 20; // свободная переменная
function bar() {
var z = 15; // свободная переменная
return x + y + z;
}
return bar();
}
foo(); //45