Вопрос: Кажется, что существует множество преимуществ для закрытий, но каковы негативы (проблемы с утечкой памяти? Проблемы с запутыванием?), Увеличение полосы пропускания?)? Кроме того, правильно ли я понимаю, что Closures? Наконец, как только замыкания создаются, они могут быть уничтожены?Javascript Closures - Каковы негативы?
Я читал немного о закрытии Javascript. Надеюсь, что кто-то немного более осведомлен будет руководить моими утверждениями, исправляя меня, где неправильно.
Преимущества Closures:
- инкапсулировать переменные в локальной области, используя внутреннюю функцию. Анонимность функции несущественна.
Что я нашел полезным, чтобы сделать некоторые основные тестирования, о местном/глобальном масштабе:
<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 считается неопределенным, потому что «var» используется для обозначения локальной переменной этой функции. - Об этом говорили раньше, в порядке работы для механизма Javascript, это просто приятно видеть, что это работает.
Глобалы все еще могут использоваться, но локальные переменные будут перекрывать их. Обратите внимание, что перед третьим вызовом myFunc создается глобальная переменная с именем local_count, но она не влияет на внутреннюю функцию, которая имеет переменную, которая имеет одно имя. И наоборот, каждый вызов функции имеет возможность изменять глобальные переменные, как заметил global_var3.
сообщение Мысли: Даже если код прост, он завален на уведомления для вас, ребята, так что вы можете подключить и играть.
Я знаю, что есть другие примеры замыканий, многие из которых используют анонимные функции в сочетании с петлевыми структурами, но я думаю, что это хорошо для 101-стартового курса, чтобы увидеть эффекты.
Единственное, что меня беспокоит, это негативное воздействие на память. Поскольку он сохраняет открытую функциональную среду, он также сохраняет эти переменные, хранящиеся в памяти, что может/не иметь последствий для производительности, особенно в отношении обходов DOM и сбора мусора. Я также не уверен, какую роль это будет играть в плане утечки памяти, и я не уверен, что закрытие можно удалить из памяти простым «delete myFunc ;."
Надеется, что это помогает кому-то,
vol7ron
Я попкорн для этого. – Pointy