На самом деле, это не лучший пример для иллюстрации закрытия. Это просто не создает.
Для иллюстрации закрытия надлежащим образом в этом случае код должен быть следующим:
function f() {
var a = 1
function g() {
alert(a)
}
return g
}
var func = f();
func() // 1
Так дело в том, что, когда функция f
прибудет, оформленного возвращает функцию g
, которая содержит ссылку на контекст выполнения вызываемой функции f
(она содержит все переменные, объявленные внутри функции, переданные аргументы, цепочку областей и т. д.). Обычно после выполнения сборщик мусора должен был удалить контекст выполнения из памяти, но возвращаемая функция g
содержит ссылку на него, поэтому она не удаляется.
Когда функция func
называется, она обращается к переменной a
от так называемого закрытия и предупреждает об этом, но нет другого способа получить доступ к этой переменной.
Если у вас нет глубокого понимания того, что там происходит, я предлагаю вам прочитать this article. Это довольно старый, но очень подробно объясняет эту тему.
Другой good one, который я обнаружил недавно, немного легче понять, поэтому вы можете начать с него, а затем вернуться к первому, о котором я упоминал.
Hoped это помогло немного.
Что вы подразумеваете под «значением»? Где вы нашли код? – Pointy
Может ли автор этого кода добавлять некоторые точки с запятой в некоторые места, или он исходит из фона VB? – Jivan
@Pointy http://javascript.info/tutorial/closures – rosemary