1. Объем переменных
Чтобы понять закрытие, вы должны сначала понять особую переменную варианта JavaScript.
Существует только два типа областей переменных: глобальные переменные и локальные переменные.
Особенностью языка JavaScript является то, что глобальные переменные могут быть прочитаны непосредственно в функциях.
var n = 999; функция f1 () {alert (n); } f1 (); // 999С другой стороны, локальные переменные внутри функции, естественно, не считываются вне функции.
Функция f1 () {var n = 999; } alert (n); // ошибкаЗдесь есть место, где нужно отметить. При провозглашении переменных внутренне вы должны использовать команду VAR. Если нет, вы на самом деле объявите глобальную переменную!
Функция f1 () {n = 999; } f1 (); предупреждение (n); // 9992. Как прочитать локальные переменные снаружи?
По разным причинам нам иногда нужно получить локальные переменные в рамках функции. Однако, как упоминалось ранее, при нормальных обстоятельствах это не может быть сделано и может быть достигнуто только с помощью обходных путей.
То есть определить другую функцию внутри функции.
Функция f1 () {var n = 999; функция f2 () {alert (n); // 999}}В приведенном выше коде функция F2 включена внутри функции F1, а все локальные переменные внутри F1 видны для F2. Но наоборот невозможно. Локальные переменные внутри F2 невидимы для F1. Это структура «цепочка», уникальная для языка JavaScript. Дочерние объекты будут искать вверх уровнем по уровню для всех переменных родительских объектов. Следовательно, все переменные родительского объекта видны для дочернего объекта, в противном случае это не так.
Поскольку F2 может читать локальные переменные в F1, если F2 используется в качестве возврата, не можем ли мы прочитать ее внутренние переменные вне F1?
Функция f1 () {var n = 999; функция f2 () {alert (n); } return f2; } var result = f1 (); результат(); // 9993. Концепция закрытия
Функция F2 в предыдущем разделе кода является закрытием.
Определение «закрытия» в различных профессиональных документах очень абстрактно и трудно понять. Насколько я понимаю, закрытие - это функция, которая может считывать переменные внутри других функций.
Поскольку на языке JavaScript только подфункции внутри функций могут читать локальные переменные, закрытия можно просто понимать как «функции, определенные внутри функции».
Итак, по сути, закрытие - это мост, соединяющий внутреннюю и внешнюю часть функции.
4. Цель закрытия
Закрытие можно использовать во многих местах. Он имеет два самых больших применения, одно из них заключается в том, что переменные внутри функции могут быть прочитаны, как упомянуто выше, а другой заключается в том, что значения этих переменных всегда хранятся в памяти.
Как понять это предложение? Пожалуйста, смотрите код ниже.
Функция f1 () {var n = 999; nadd = function () {n+= 1} function f2 () {alert (n); } return f2; } var result = f1 (); результат(); // 999 nadd (); результат(); // 1000В этом коде результат фактически является функцией закрытия F2. Всего он работает дважды, первое значение составляет 999, а второе значение составляет 1000. Это доказывает, что локальная переменная n в функции F1 сохранилась в памяти и не полностью очищена после вызова F1.
Почему это происходит? Причина в том, что F1 является родительской функцией F2, а F2 назначается глобальной переменной, которая заставляет F2 всегда в памяти, а существование F2 зависит от F1. Следовательно, F1 всегда находится в памяти и не будет переработана механизмом сбора мусора после завершения вызова.
Другая примечательная точка в этом коде заключается в том, что строка «nadd = function () {n+= 1}» сначала используется перед NADD, поэтому NADD является глобальной переменной, а не локальной переменной. Во -вторых, значение NADD является анонимной функцией, и сама эта анонимная функция также является закрытием, поэтому NADD эквивалентен сеттеру, который может работать на локальных переменных внутри функции вне функции.
5. Примечания об использовании закрытия
1) Поскольку закрытие приведет к тому, что все переменные в функции хранятся в памяти, а потребление памяти очень большое, закрытие нельзя злоупотреблять, в противном случае это вызовет проблемы с производительностью веб -страницы и может привести к утечке памяти в IE. Решение состоит в том, чтобы удалить все локальные переменные, которые не используются перед выходом на функцию.
2) Закрытие изменит значение переменной внутри родительской функции вне родительской функции. Следовательно, если вы используете родительскую функцию в качестве объекта, используйте закрытие в качестве общедоступного метода и используйте внутреннюю переменную в качестве ее личного свойства, будьте осторожны, чтобы не изменить значение внутренней переменной родительской функции по желанию.