Pregunta: Parece que hay muchos beneficios para los cierres, pero ¿cuáles son los aspectos negativos (pérdida de memoria, problemas de ofuscación, aumento del ancho de banda)? Además, ¿es correcto mi entendimiento de Closures? Finalmente, una vez que se crean cierres, ¿pueden destruirse?Cierres de Javascript: ¿Cuáles son los aspectos negativos?
He estado leyendo un poco acerca de los cierres de Javascript. Espero que alguien un poco más informado guíe mis afirmaciones, corrigiéndome donde está mal.
Beneficios de Cierre:
- encapsular las variables a un ámbito local, mediante el uso de una función interna. El anonimato de la función es insignificante.
Lo que he encontrado es útil para hacer algunas pruebas básicas, en cuanto a/alcance global local:
<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>
cosas interesantes que llevaron a cabo de la misma:
El las alertas en outerFunc solo se llaman una vez, que es cuando la llamada outerFunc se asigna a myFunc (myFunc = outerFunc()). Esta asignación parece mantener el outerFunc abierto, en lo que me gustaría llamar un estado persistente.
Cada vez que se invoca myFunc, se ejecuta la devolución. En este caso, el retorno es la función interna.
Algo realmente interesante es la localización que se produce al definir las variables locales. Observe la diferencia en la primera alerta entre global_num1 y global_num2, incluso antes de que la variable intente crearse, global_num1 se considera indefinido porque la 'var' se usó para indicar una variable local para esa función. - Esto ya se ha mencionado anteriormente, en el orden de operación del motor Javascript, es agradable ver que esto funcione.
Se pueden usar globos globales, pero las variables locales los anularán. Observe antes de la tercera llamada myFunc, se crea una variable global llamada local_count, pero no tiene ningún efecto en la función interna, que tiene una variable con el mismo nombre. Por el contrario, cada llamada a función tiene la capacidad de modificar variables globales, como lo notó global_var3.
Pon Pensamientos: A pesar de que el código es sencillo, que está lleno de alertas para ustedes, para que pueda conectar y jugar.
Sé que hay otros ejemplos de cierres, muchos de los cuales usan funciones anónimas en combinación con estructuras de bucle, pero creo que esto es bueno para un curso de 101 iniciadores para ver los efectos.
Lo que más me preocupa es el impacto negativo que los cierres tendrán en la memoria. Debido a que mantiene abierto el entorno de funciones, también mantiene esas variables almacenadas en la memoria, lo que puede/no tener implicaciones en el rendimiento, especialmente con respecto a los recorridos DOM y la recolección de basura. Tampoco estoy seguro de qué tipo de rol jugará esto en términos de pérdida de memoria y no estoy seguro de si el cierre se puede eliminar de la memoria con un simple "eliminar myFunc ;."
Espero que esto ayude a alguien,
vol7ron
Estoy sacando algunas palomitas de maíz para esta. – Pointy