Что именно означает "закрытие" в JavaScript?


Я понимаю, что такое закрытие, но у меня возникли некоторые проблемы с grokking именно то, что термин closure относится. Я видел термин, используемый во многих веб-сайтах, но редко они соглашаются на фактическое определение.

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

может кто-нибудь сказать мне точно, к чему closure относится?

7 67

7 ответов:

с Закрытие JavaScript

два резюме по одному предложению:

замыкание-это локальные переменные для функция-сохраненный живой после функция вернулась, или

закрытие-это стек-фрейм, который является не освобождается, когда функция возвращается. (как если бы "стек-фрейм" был Танос объед вместо того, чтобы стек!)

очень хорошая статья на закрытие

Закрытие Javascript

"закрытие" - это выражение (обычно функция) может иметь свободные переменные вместе с среда, которая связывает эти переменные (что "закрывает" выражение).

простое объяснение закрытия что ECMAScript позволяет внутренний функции; определения функций и выражения функций, которые находятся внутри тела функций других функций. И что те внутренние функции разрешенный доступ ко всем локальным переменные, параметры и объявленные внутренние функции внутри их наружные функция(ы). Закрытие формируется, когда одна из тех внутренних функций сделана доступна вне функции в который он содержал, так что он может после внешней функции вернулся. В какой момент он все еще имеет доступ к локальным переменным, параметры и внутренняя функция объявления его внешней функции. Те, что местные переменные, параметры и объявления функций (изначально) имеют значения, которые они имели, когда внешняя функция возвращается и может быть взаимодействует с внутренней функцией.

хороший пример здесь

JavaScript, время Грок закрытия

это функция, которая "держит" ссылку или ссылки на что-то в другой области. Например:

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

по существу замыкание-это тело функции, закрытое над своими идентификаторами (переменными) в своей локальной среде.

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