Закрытие создается путем вызова функции; сама функция не является закрытием. Концептуально каждый вызов функции неявно приводит к появлению нового замыкания. Для некоторых функций замыкание является эфемерным и просто исчезает, как только возвращается функция:
function add2(n) {
return n + 2;
}
Эта функция возвращает только число; ничто не может ссылаться на что-либо в замыкании, созданном вызовом функции, поэтому замыкание исчезает, и все, что у вас остается, это возвращаемое значение.
Закрытие становится интересным, когда функция возвращает то, что имеет один или несколько «хуков», в локальную среду, созданную при вызове функции. (Функция может открывать замыкание, изменяя также глобальную среду.) Итак, эта функция:
function addn(addend) {
return function(n) {
return n + addend;
}
}
предоставляет закрытие, потому что возвращаемая функция имеет ссылку на параметр внешней функции.
Я не могу придумать, каким образом обычная функция может представить замыкание, которое каким-то образом не включает в себя одну или несколько функций, которые ссылаются на вещи из локального контекста (параметры, переменные). (Функции генератора интересны, потому что yield
своего рода всегда возвращает что-то, что представляет закрытие, я полагаю.)