No es una "fuga" exactamente, pero esto puede ser una trampa común.
var fn = (function() {
var a = "super long string ...";
var b = "useless value";
var c = "Hello, World!";
return function() {
return c;
};
})();
Esto devuelve una función que hace referencia a un ámbito, y se mantendrá en todas las var sola en ese ámbito, a pesar de que solamente uno de esos valores son necesarios. Esto da como resultado más uso de memoria de la que necesita, especialmente si su función usa una variable pequeña, pero hay grandes valores en ese ámbito que no necesita seguir consultando.
Cómo corregirlo?
La opción simple es anular las variables que no le interesan al final de su función. Las variables todavía están en el alcance, pero sus datos se liberarán.
var fn = (function() {
var a = "super long string ...";
var b = "useless value";
var c = "Hello, World!";
// do stuff with a and b
a = b = null;
return function() {
return c;
};
})();
O puede romper cualquier cosa que utiliza temp vars en su propia función de lo que sus alcances pueden ser liberados. Esta es una mejor solución para un proyecto más grande.
var doSetup = function() {
var a = "super long string ...";
var b = "useless value";
// do stuff with a and b
};
var fn = (function() {
doSetup();
var c = "Hello, World!";
return function() {
return c;
};
})();
lo que si no volvía c pero no hizo referencia a ello como esto: ' fn var = (function() {var a = "cadena super largo ..."; var b = "valor inútil" ; var c = "¡Hola, mundo!"; función() { c = "algo más"; }; })(); ' – crickeys
El punto es que si todavía se hace referencia a la función, el ámbito de cierre que la creó se guarda en la memoria. Lo que esa función realmente hace no tiene ningún efecto en ese hecho. –
Entonces, ¿cómo arreglarías el código original que publicaste para asegurarte de que no se estaba filtrando más? – crickeys