Требует ли (JS) замыкания функции внутри функции?

У меня небольшие затруднения с внутренней концепцией закрытия. Я понял основную идею, но вот в чем дело: я думал, что технически есть «закрытие» внутри каждой функции Javascript. Цитата из Википедии:

В информатике закрытие (также лексическое закрытие, закрытие функции или значение функции) - это функция вместе со ссылкой среда для нелокальных имен (свободных переменных) этой функции. Такая функция называется «закрытой» над своими свободными переменными.

Итак, поскольку вы можете определять переменные внутри функции, они «закрыты» для остальной части вашего кода, и поэтому я рассматриваю это как закрытие. Таким образом, насколько я понимаю:

(function(){var a = 1;}())

Это (не очень полезный) пример закрытия. Или, черт возьми, даже это:

function(){var a = 1;}

Но я думаю, что мое понимание может быть неверным. Другие говорят мне, что для того, чтобы что-то было закрытием, оно должно сохранять состояние, и, поскольку ничего не сохраняется за пределами этого кода, на самом деле это не закрытие. Это говорит о том, что вам необходимо иметь:

function(foo){foo.a = 1;}(bar); // bar.a = 1

или даже (чтобы гарантировать неизменяемость):

function(foo){var a = 1; bar.baz = function() { return a}}(bar); // bar.baz() = 1

Итак, технически говоря (я знаю, что некоторые из примеров практически бессмысленны, но) какие из приведенных выше примеров на самом деле являются примерами закрытий. И должно ли замыкание быть просто пространством (т.е. внутри JS-функции), где могут храниться переменные, к которым нельзя получить доступ извне, или постоянство является ключевой частью определения замыкания?

РЕДАКТИРОВАТЬ

Только что заметил вики-определение тега «закрытия» в Stack Overflow:

Закрытие - это первоклассная функция, которая обращается к (закрывается) переменные из области, в которой он был определен. Если закрытие еще существует после окончания его определяющей области, переменные, которые он закрывает

Хотя SO wiki, безусловно, не является окончательным авторитетом, первое предложение, похоже, коррелирует с моим пониманием этого термина. Затем во втором предложении предлагается, как можно использовать закрытие, но это не похоже как требование.

РЕДАКТИРОВАТЬ №2

В случае, если это не ясно из различных ответов здесь, ответ Википедии и ответ тега, похоже, нет четкого консенсуса относительно того, что вообще означает слово «закрытие». Итак, хотя я ценю все ответы на данный момент, и все они имеют смысл, если вы следуете авторскому определению закрытия, то, что, я думаю, я действительно ищу, это ... есть ли какое-либо фактическое "авторитетное" определение слова ( и если да, то как это применимо ко всему вышеперечисленному)?

8
задан machineghost 17 August 2011 в 20:38
поделиться