tl; dr: Каждая функция технически является закрытием в JavaScript.
Глобальная среда ничего особенного в этом отношении (она особенная в других отношениях).Это просто первая среда, которая создается и как таковая находится в конце каждой «цепочки среды».Т.е. каждая среда, созданная во время выполнения программы, создается «внутри» глобальной / первой / верхней среды и, таким образом, доступна для всех.
См. Ниже дополнительную информацию о том, как связаны среды и функции.
Что такое замыкание?
Закрытие - это функция, которая может получить доступ и разрешить свободные переменные .Это переменные, которые не являются параметрами функции и не определены в самой функции.
a
является свободной переменной в вашем примере.
Как функции разрешают свободные переменные в JavaScript?
Вы можете представить себе среду / область видимости как таблицу или объект, который связывает значение с меткой.Например, среда, содержащая
var a = 42;
, может выглядеть как
+--------+
| a | 42 |
+--------+
Теперь, когда вы определяете функцию, она получает ссылку на среду (т.е. эта метка-> ассоциация значения), в которой она была создана. Среда, содержащая
var a = 42;
function foo(bar) {
console.log(a);
}
, будет выглядеть как
+--------+
|a | 42| +----------------+
|foo | -+---------> FunctionObject |
+--------+ +----------------+
^ |name | "foo" |
| |[[env]] | ---+ -+
| +----------------+ |
| |
+---------------------------------+
Теперь, когда foo
равно , выполните создается новая среда, в которой родительская среда является средой, в которой была создана функция. Т.е. когда происходит foo(21)
, наше состояние:
+-----------------+
|bar | 21 |
|[[parent]] | ---+--+
+-----------------+ |
|
+---------------+
|
v
+--------+
|a | 42| +----------------+
|foo | -+---------> FunctionObject |
+--------+ +----------------+
^ |name | "foo" |
| |[[env]] | ---+--+
| +----------------+ |
| |
+---------------------------------+
Теперь, когда мы пытаемсяaccess a
, он не найден в текущей среде, поэтому мы смотрим на его родителя, где он определен.
Опять же, глобальная среда 1053 * ничего особенного в этом отношении не представляет.Это просто среда first , которая создается, поэтому каждая функция имеет ссылку на нее (прямо или косвенно в случае вложенных функций).Вот что делает его «глобальным».