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

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

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

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

Ответ 1

От Закрытие JavaScript

Два резюме одного предложения:

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

Закрытие представляет собой стек-фрейм, который является не освобождается, когда функция возвращается. (как будто "стоп-кадр" был malloc'ed вместо того, чтобы быть на стек!)

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

Закрытие Javascript

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

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

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

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

Ответ 2

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

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent 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.

Вот графическое объяснение.

Ответ 3

Для меня закрытие в JS позволяет вам сделать следующее.
" a "остается доступным во внутренней функции при добавлении к" b", хотя он объявлен за пределами.

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

Для экстремального использования закрытий JS вы можете посмотреть исходный код библиотеки PURE (механизм шаблонов JS)

Ответ 4

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

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

В этом случае вышеуказанный function closure определяется внутри тела delay_message, но определение функции - а также родительская функциональная переменная msg - выделяет область действия вызова функции delay_message.

Ответ 5

Рассмотрим следующий код, который создает замыкание с переменными 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

Ответ 6

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

Ответ 7

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

Ответ 8

Закрытие означает функцию (внешнюю функцию), содержащую другую функцию (внутреннюю функцию).

Закрытие используется для защиты данных.

использование доводчиков продемонстрировано в приведенной ниже ссылке на видео:

https://www.youtube.com/watch?v=w1s9PgtEoJs