Закрытие - это сложность на языке JavaScript и его функции. Многие передовые приложения полагаются на закрытие для реализации.
Закрытие имеет три характеристики:
1. Функция вложенных функций
2. Функция может относиться к внешним параметрам и переменным внутри
3. Параметры и переменные не будут собираться механизмом сбора мусора
Закрытие относятся к функциям, которые имеют доступ к переменным в области другой функции. Наиболее распространенным способом создания закрытия является создание другой функции в одной функции и получить доступ к локальным переменным этой функции через другую функцию.
Существует преимущество использования закрытия, и оно также является недостатком этого, что состоит в том, что оно может проживать локальные переменные в памяти и избегать использования глобальных переменных. Глобальные переменные можно вызовать в каждом модуле, который должен быть катастрофическим.
Поэтому рекомендуется использовать частные, инкапсулированные локальные переменные.
После выполнения общей функции локальный активный объект разрушается, и только глобальный объем сохраняется в памяти. Но ситуация закрытия отличается!
Закрытие для вложенных функций:
функция aaa () {var a = 1; return function () {alert (a ++)}; } var fun = aaa (); fun (); // 1 после исполнения a ++, тогда a все еще в ~ Fun (); // 2 Fun = null; // a переработано! !Приведенный выше результат вывода составляет 5;
Закрытие будет постоянно держать переменные в памяти, и при неправильном использовании увеличивает потребление памяти.
Принцип сбора мусора в JavaScript
(1) в JavaScript, если объект больше не ссылается, то объект будет переработан GC;
(2) Если два объекта ссылаются друг на друга и больше не ссылаются третьим лицом, то эти два объекта относятся друг к другу, также будут переработаны.
Так каковы преимущества использования закрытия? Преимущества использования закрытия:
1. Я надеюсь, что переменная находится в памяти долгое время
2. Избегайте загрязнения глобальных переменных
3. Существование частных членов
1. Накопление глобальных переменных
<script> var a = 1; function abc () {a ++; Alert (a);} abc (); // 2ABC (); // 3 </script>2. Локальные переменные
<Script> function abc () {var a = 1; a ++; Alert (a);} abc (); // 2ABC (); // 2 </script>Итак, как можно достичь переменной, которая может быть накоплена локальной переменной и может быть накоплена?
3. Накопление локальных переменных (которые могут сделать закрытие)
<Script> function Outter () {var x = 10; return function () {// Функция вложенная функция x ++; предупреждение (x); }} var y = over (); // Внешняя функция присваивается переменной y; y (); // y функция вызывается один раз, результат - 11y (); // y функция называется вторым раз, результат - 12, осознавая накопление </script>Объявления функций и выражения функций в JS:
В JS мы можем объявить функцию через функцию ключевого слова:
<Script> function abc () {alert (123);} abc (); </script>Мы также можем использовать «()», чтобы превратить это объявление в выражение:
<script> (function () {alert (123);}) (); // Затем напрямую вызовуте предыдущее выражение через (), поэтому функция не должна писать имя; </script>4. Модульный код для уменьшения загрязнения глобальных переменных
<script> var abc = (function () {// abc - возвращаемое значение внешней анонимной функции var a = 1; return function () {a ++; alert (a);}}) (); abc (); // 2; Вызов функции ABC один раз на самом деле вызывает возвратное значение внутренней функции ABC (); // 3 </script>5. Существование частных членов
<script> var aaa = (function () {var a = 1; function bbb () {a ++; alert (a);} function ccc () {a ++; alert (a);} return {b: bbb, // json structure c: ccc}}) (); aaa.b (); //2AAA.C () // 3 </script>6. непосредственно найдите индекс соответствующего элемента в цикле
<! Doctype html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "en"> <Head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> </title> <script> window. document.getElementsbytagname ('li'); for (var i = 0; i <ali.length; i ++) {ali [i] .onclick = function () {// Когда нажимается, цикл окончал оповещение (i); }; }} </script> </head> <body> <ul> <li> <li> 123 </li> <li> 456 </li> <li> 789 </li> <li> 010 </li> </ul> </body> </html>7. Используйте закрытие, чтобы переписать вышеуказанный код:
<! Doctype html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml" xml: lang = "en"> <Head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> </title> <script> window. document.getElementsbytagname ('li'); for (var i = 0; i <ali.length; i ++) {(function (i) {ali [i] .onclick = function () {alert (i);};}) (i); }}; </script> </head> <body> <ul> <li> 123 </li> <li> 456 </li> <li> 789 </li> </ul> </body> </html>