Смутное закрытие в 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
Я настоятельно рекомендую следующую статью . Я нашел, что это отличная отправная точка для понимания закрытий.