Что именно означает «закрытие» в JavaScript? - PullRequest
71 голосов
/ 26 ноября 2009

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

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

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

Ответы [ 8 ]

45 голосов
/ 26 ноября 2009

С JavaScript Closures

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

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

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

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

Javascript Closures

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

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

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

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

6 голосов
/ 26 ноября 2009

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

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.

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

4 голосов
/ 26 ноября 2009

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

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

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

2 голосов
/ 12 ноября 2014

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

2 голосов
/ 26 ноября 2009

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

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

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

1 голос
/ 20 марта 2011

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

1 голос
/ 26 ноября 2009

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

0 голосов
/ 15 июня 2019

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

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

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

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

...