Смутное закрытие в JavaScript

Возможный дубликат:
Как работают блокировки JavaScript? Закрытие Javascript и побочные эффекты на простом английском языке? (отдельно)

Я новичок в JavaScript, но я действительно смущен тем, как работают замыкания. Может ли кто-то объяснить в непрофессиональных терминах, каковы они или почему они полезны?

Ответы

Ответ 1

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

function test() {
  var a = "hello world";
  var checkValue = function() { alert(a); };
  checkValue();
  a = "hi again";
  return checkValue;
}

var pointerToCheckValue = test();  //it will print "hello world" and a closure will be created with the context where the checkValue function was defined.
pointerToCheckValue(); //it will execute the function checkValue with the context (closure) used when it was defined, so it still has access to the "a" variable

Надеюсь, что это поможет: -)

Ответ 2

Если вы начнете с простого использования, которое я получил от http://ejohn.org/apps/learn/#49

var num = 10; 

function addNum(myNum){ 
  return num + myNum; 
} 

assert( addNum(5) == 15, "Add two numbers together, one from a closure." );

Что происходит, так это то, что переменная num находится в ловушке (заключена) внутри функции addNum.

Если это становится удобно, если у вас есть что-то (это не должно запускаться должным образом):

for(var t = 0; t < 5; t++) {
  var elem = document.getElementById('mydiv' + t);
  elem.onclick = function(e) {
     alert(t);
  };
};

Это должно показать значение 5 для каждого div, заданного с помощью этого обработчика событий.

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

Это довольно продвинутая тема. После того, как вы будете более комфортно работать с javascript, вы можете захотеть узнать об этом в этот момент.

Ответ 3

Я настоятельно рекомендую следующую статью . Я нашел, что это отличная отправная точка для понимания закрытий.