Закрытие относится к функции, которая имеет разрешение на доступ к переменным в другой области функции, но механизм конфигурации объема должен обратить внимание, то есть закрытие может получить только последнее значение, содержащее любые переменные в функции.
Как в следующих случаях:
function create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function () {return i;}; } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Результаты исполнения:
На первый взгляд, кажется, что значение I, возвращаемое каждой функцией, отличается, например, значение C_ARR [0] должно быть 0, значение C_ARR [1] должно быть 1, и так далее. Каждую функцию можно получить, возвращая 10. Почему?
Поскольку цепочка сферы действия каждой функции сохраняет активный объект функции create (), все они относятся к одной и той же переменной i. После окончания цикла для цикла значение I становится 10. В настоящее время каждая функция относится к тому же объекту переменной, которая удерживает переменную i.
Мы можем заставить закрытие вести себя, как и ожидалось, создав другую доменную функцию, чтобы каждая позиция соответствовала соответствующему значению.
function create () {var arr = new Array (); for (var i = 0; i <10; i ++) {arr [i] = function (num) {return function () {return num; };}(я); } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Результаты исполнения:
Определите анонимную функцию и немедленно выполняет анонимную функцию, чтобы присвоить ее массиву. Здесь анонимная функция имеет параметр NUM, который является значением, которое будет возвращено конечной функцией. При вызове каждой функции мы передаем в переменной i. Поскольку параметры функции передаются значением, текущее значение переменной, которое я будет назначать параметрам NUM. Внутри этой анонимной функции создается и возвращается закрытие NUM, так что каждая функция в массиве ARR имеет копию своей собственной численной переменной, поэтому она может вернуть свои собственные различные численные значения.
Классические примеры
Давайте посмотрим на классический пример. Предположим, на странице есть набор тегов кнопок. Мы используем сценарии, чтобы связать событие Click с этим набором тегов кнопок, и при нажатии всплывает, что это тег.
<meta charset = "UTF-8"/> <Tood> First </button> <tood> Second </button> <tood> third </button> <tood> № четвертый </button> <script type = "text/javascript"> var obj = document.getElementsbytagname ('button'); для (var i = 0; function () {alert (i);}; } </script>Нажмите каждую кнопку, чтобы получить
На первый взгляд кажется, что нажимать на каждую метку должна появляться разные числа
Первый должен появиться 0;
Второй должен появиться 1;
И так далее.
Но результат в том, что все кнопки появляются 4, что, очевидно, не является результатом, который мы хотим.
Давайте изменим программу
<meta charset = "UTF-8"/> <Tood> First </button> <tood> Second </button> <tood> third </button> <tood> № четвертый </button> <script type = "text/javascript"> var obj = document.getElementsbytagname ('button'); для (var i = 0; function (num) {return function () {alert (num);}} (i); } </script>Нажмите на второй
Нажмите на четвертый
Нам нужно только создать анонимную функцию в функции, которая совпадает с вышеуказанными случаями. Анонимная функция может быть реализована для захвата внешней переменной I, а значение i -значения каждого кнопки POP отличается.