Вопрос: Кажется, что существует множество преимуществ для закрытий, но каковы негативы? Кроме того, правильно ли я понимаю, что Closures? Наконец, как только замыкания создаются, они могут быть уничтожены?
Я немного читал о закрытии Javascript. Я надеюсь, что кто-то немного более осведомлённый будет руководствоваться моими утверждениями, исправляя меня, где неправильно.
Преимущества закрытия:
- Инкапсулировать переменные в локальную область, используя внутреннюю функцию. Анонимность функции несущественна.
То, что я нашел полезным, - это сделать некоторые базовые тесты, касающиеся локальной/глобальной области:
<script type="text/javascript">
var global_text = "";
var global_count = 0;
var global_num1 = 10;
var global_num2 = 20;
var global_num3 = 30;
function outerFunc() {
var local_count = local_count || 0;
alert("global_num1: " + global_num1); // global_num1: undefined
var global_num1 = global_num1 || 0;
alert("global_num1: " + global_num1); // global_num1: 0
alert("global_num2: " + global_num2); // global_num2: 20
global_num2 = global_num2 || 0; // (notice) no definition with 'var'
alert("global_num2: " + global_num2); // global_num2: 20
global_num2 = 0;
alert("local_count: " + local_count); // local_count: 0
function output() {
global_num3++;
alert("local_count: " + local_count + "\n" +
"global_count: " + global_count + "\n" +
"global_text: " + global_text
);
local_count++;
}
local_count++;
global_count++;
return output;
}
var myFunc = outerFunc();
myFunc();
/* Outputs:
**********************
* local_count: 1
* global_count: 1
* global_text:
**********************/
global_text = "global";
myFunc();
/* Outputs:
**********************
* local_count: 2
* global_count: 1
* global_text: global
**********************/
var local_count = 100;
myFunc();
/* Outputs:
**********************
* local_count: 3
* global_count: 1
* global_text: global
**********************/
alert("global_num1: " + global_num1); // global_num1: 10
alert("global_num2: " + global_num2); // global_num2: 0
alert("global_num3: " + global_num3); // global_num3: 33
</script>
Интересные вещи, которые я извлек из него:
-
Предупреждения в outerFunc вызываются только один раз, то есть когда вызов externalFunc назначается myFunc (myFunc = outerFunc()). Это назначение, по-видимому, сохраняет openFunc открытым, в том, что я хотел бы назвать постоянным состоянием.
-
Каждый раз, когда вызывается myFunc, выполняется возврат. В этом случае возврат является внутренней функцией.
-
Что-то действительно интересное - это локализация, возникающая при определении локальных переменных. Обратите внимание на разницу в первом предупреждении между global_num1 и global_num2, даже до того, как переменная пытается быть создана, global_num1 считается undefined, потому что 'var' использовался для обозначения локальной переменной этой функции. - Об этом говорили раньше, в порядке работы для механизма Javascript, просто приятно видеть, как это работает.
-
Глобалы все еще можно использовать, но локальные переменные будут переопределять их. Обратите внимание, что перед третьим вызовом myFunc создается глобальная переменная с именем local_count, но она не влияет на внутреннюю функцию, которая имеет переменную, которая имеет одно имя. И наоборот, каждый вызов функции имеет возможность изменять глобальные переменные, как заметил global_var3.
Пост мысли: Несмотря на то, что код прост, он загроможден оповещениями для вас, поэтому вы можете подключаться и играть.
Я знаю, что есть другие примеры замыканий, многие из которых используют анонимные функции в сочетании с циклами, но я думаю, что это хорошо для 101-стартового курса, чтобы увидеть эффекты.
Единственное, о чем я беспокоюсь, это негативное влияние закрытия на память. Поскольку он сохраняет открытую функциональную среду, он также сохраняет эти переменные, хранящиеся в памяти, что может/не иметь последствий для производительности, особенно в отношении обходов DOM и сбора мусора. Я также не уверен, какую роль это будет играть в плане утечки памяти, и я не уверен, что закрытие может быть удалено из памяти простым "delete myFunc;."
Надеюсь, это поможет кому-то,
vol7ron