Что именно означает "закрытие" в JavaScript?
Я понимаю, что такое закрытие, но у меня возникли некоторые проблемы с grokking именно то, что термин closure
относится. Я видел термин, используемый во многих веб-сайтах, но редко они соглашаются на фактическое определение.
- это переменные, которые хранятся на стек?
- это функция, которая возвращается?
- это область действия внешней функции?
- это область внутреннего (возвращается) функции?
- это может быть концепция сохранения переменных в стеке-кадре после возврата функции?
может кто-нибудь сказать мне точно, к чему closure
относится?
7 ответов:
два резюме по одному предложению:
замыкание-это локальные переменные для функция-сохраненный живой после функция вернулась, или
закрытие-это стек-фрейм, который является не освобождается, когда функция возвращается. (как если бы "стек-фрейм" был Танос объед вместо того, чтобы стек!)
очень хорошая статья на закрытие
"закрытие" - это выражение (обычно функция) может иметь свободные переменные вместе с среда, которая связывает эти переменные (что "закрывает" выражение).
простое объяснение закрытия что ECMAScript позволяет внутренний функции; определения функций и выражения функций, которые находятся внутри тела функций других функций. И что те внутренние функции разрешенный доступ ко всем локальным переменные, параметры и объявленные внутренние функции внутри их наружные функция(ы). Закрытие формируется, когда одна из тех внутренних функций сделана доступна вне функции в который он содержал, так что он может после внешней функции вернулся. В какой момент он все еще имеет доступ к локальным переменным, параметры и внутренняя функция объявления его внешней функции. Те, что местные переменные, параметры и объявления функций (изначально) имеют значения, которые они имели, когда внешняя функция возвращается и может быть взаимодействует с внутренней функцией.
хороший пример здесь
это функция, которая "держит" ссылку или ссылки на что-то в другой области. Например:
var myArrayOfFunctions = []; for(var i = 0; i<3: i++) { //Note how the function being defined uses i, //where i lives in the parent's scope, this creates a closure myArrayOfFunctions[i] = function(a) { return a + i;} } myArrayOfFunctions[0](5); //Prints 8 WTF! myArrayOfFunctions[1](5); //8 again myArrayOfFunctions[2](5); //Well, this 8 was expected
это происходит потому, что когда функции "созданы", они не копируют значение i, Они содержат ссылку на i, поэтому при вызове функций они используют текущее значение i, которое равно 3.
для меня закрытие в JS позволяет вам делать следующее.
"a "остается доступным во внутренней функции при добавлении к" b", хотя он объявлен снаружи.function adder(a){ return function(b){ return a + b; }; } var add5 = adder(5); alert( add5(10) );
для экстремального использования замыканий JS вы можете посмотреть на исходный код из чистой библиотеки (JS templating engine)
насколько я могу судить, замыкание-это функция, определенная в другой функции, которая переживает область родительской функции. Общий пример-обратные вызовы:
function delay_message(msg) { setTimeout(function closure() { alert(msg); }, 1000); }
в этом случае выше
function closure
определяется в телеdelay_message
, но определение функции, а также функции по переменнойmsg
-- пережить областьdelay_message
вызов функции.
рассмотрим следующий код, который создает замыкание с переменными a и b
closure=(function(){ var a=3 var b=5 return function(operation){ return operation(a,b) } }()) // The variables a and b are now part of the closure (They are retained even after the outer function returns) closure(function(x,y){return x+y}) // outputs 8 closure(function(x,y){return x*y}) // outputs 15`
Это конкретное замыкание теперь может принимать любую функцию, которая работает с переменными a и b