Давайте посмотрим на цель закрытия. На самом деле, используя закрытие, мы можем сделать много вещей. Например, моделируйте объектно-ориентированный стиль кода; Экспресс код более элегантно и кратко; и повысить эффективность выполнения кода в некоторых аспектах.
1 анонимная функция самостоятельной работы
Мы знаем, что если все переменные не добавляются с помощью ключевого слова VAR, по умолчанию будет добавлено в свойства глобального объекта. Есть много недостатков в добавлении таких временных переменных в глобальный объект.
Например: другие функции могут неправильно использовать эти переменные; заставляя глобальный объект быть слишком большим и влиять на скорость доступа (потому что значение переменной необходимо пройти из цепи прототипа).
В дополнение к использованию ключевого слова VAR каждый раз, когда мы используем переменную, мы часто сталкиваемся с ситуацией, в которой необходимо выполнять некоторые функции только один раз, а их внутренние переменные не нужно поддерживать.
Например, при инициализации пользовательского интерфейса мы можем использовать закрытие:
Кода -копия выглядит следующим образом:
var DataModel = {
стол : [],
дерево : {}
};
(function (dm) {
для (var i = 0; i <dm.table.rows; i ++) {
var row = dm.table.rows [i];
for (var j = 0; j <row.cells; i ++) {
Drawcell (i, j);
}
}
// строить dm.tree
}) (DataModel);
Мы создаем анонимную функцию и немедленно выполняем ее, поскольку внешний не может ссылаться на переменные внутри нее,
Поэтому он будет выпущен вскоре после исполнения. Ключ в том, что этот механизм не загрязнет глобальный объект.
2 кэш
Давайте возьмем еще один пример. Представьте, что у нас есть очень трудоемкий объект функции, который занимает много времени для обработки каждого вызова.
Тогда нам нужно сохранить рассчитанное значение. При вызове этой функции мы сначала смотрим в кэше. Если его нельзя найти, мы выполним расчет.
Затем обновите кэш и верните значение. Если это найдено, просто верните найденное значение напрямую. Закрытие делает именно это, потому что оно не выпускает внешние ссылки,
Таким образом, значение внутри функции может быть сохранено.
Кода -копия выглядит следующим образом:
var cachedsearchbox = (function () {
var cache = {},
count = [];
возвращаться {
AttachSearchBox: function (dsid) {
if (dsid в кэше) {// Если результат в кэше
вернуть кэш [dsid]; // вернуть непосредственно к объекту в кэше
}
var fsb = new uikit.webctrl.searchbox (dsid); // новый
кэш [dsid] = fsb; // Обновление кэш
if (count.length> 100) {// Размер кэша гарантирован <= 100
Удалить кэш [count.shift ()];
}
вернуть FSB;
},
ClearSearchBox: function (dsid) {
if (dsid в кэше) {
кэш [dsid] .clearselection ();
}
}
};
}) ();
Cachedsearchbox.attachsearchbox ("input1");
Таким образом, когда мы называем cachedsearchbox.attachserachbox ("input1") во второй раз,
Мы можем получить доступ к объекту из кэша без создания нового объекта Searchbox.
3 Реализация упаковки
Давайте сначала рассмотрим пример инкапсуляции. Переменные внутри недоступны вне человека, но доступны путем предоставления закрытия:
Кода -копия выглядит следующим образом:
var person = function () {
// Область переменной находится внутри функции и не может быть доступен за пределами функции
var name = "по умолчанию";
возвращаться {
getName: function () {
вернуть имя;
},
setName: function (newName) {
name = newName;
}
}
} ();
print (person.name); // прямой доступ, результат не определен
print (person.getName ());
Person.setName ("Abruzzi");
print (person.getName ());
Результаты следующие:
неопределенный
по умолчанию
Абруцци
4 Другая важная цель закрытия-реализация объектно-ориентированных объектов. Традиционные языки объектов обеспечивают механизмы шаблона класса.
Таким образом, разные объекты (экземпляры классов) имеют независимые члены и государства и не мешают друг другу. Хотя такого механизма нет, как класс в JavaScript, с помощью закрытия,
Мы можем имитировать такой механизм. Давайте поговорим о приведенном выше примере:
Кода -копия выглядит следующим образом:
функция Person () {
var name = "по умолчанию";
возвращаться {
getName: function () {
вернуть имя;
},
setName: function (newName) {
name = newName;
}
}
};
var John = person ();
print (john.getName ());
John.setname ("John");
print (john.getName ());
var jack = person ();
print (jack.getName ());
jack.setname ("jack");
print (jack.getName ());
Результаты работы следующие:
по умолчанию
Джон
по умолчанию
Джек
Из этого кода мы видим, что и Джона, и Джека можно назвать экземплярами класса человека, потому что доступ к имени участника независимо и не влияет друг на друга.
Вышеуказанное функция закрытия JS, которая очень проста и легко понять. Я надеюсь, что это будет полезно для моих друзей.