¿Los Javascript IIFE anónimos permanecen en la pila de memoria después de ser usados?

tl; dr : las variables persisten mientras se haga referencia a ellas, independientemente del alcance en el que se declaren. Por lo tanto, en términos generales, puede esperar que las variables tengan el mismo ciclo de vida en un alcance cerrado (IIFE) de lo que hubieran tenido sido declarado en el ámbito global. Las variables que ya no se usarán serán basura recolectada; los que se sigan utilizando se conservarán.

Oluwalana Olasubomi tiene razón en que los IIFE no permanecen en la pila y, en general, no son accesibles una vez que se han completado. Sin embargo, su ejemplo es engañoso porque no es un IIFE (expresión de función invocada de inmediato) y los IIFE se usan típicamente para crear cierres por encapsular datos privados (lo que significa que muchas variables declaradas en la mayoría de los IIFE no se liberan después del IIFE). ha corrido hasta su finalización). Aquí hay un mejor ejemplo:

(función () {
recuento var = 0;
elemento var = document.getElementById (‘click-target’);

element.addEventListener (‘click’,
función () {
++ recuento;
console.log (‘Clics de destino:’, cuenta);
});
} ());

La expresión de función definida comenzando en la línea 1 se invoca inmediatamente en la línea 10. No se puede invocar más de una vez porque (a) el motor de JavaScript se ve obligado (mediante el uso de paréntesis alrededor del IIFE) a interpretar la declaración como una expresión (no, por ejemplo, como una declaración de función) y (b) la función invocada de inmediato es anónima † (no tiene un identificador para llamarla).

La variable de count (línea 2) es privada para el cuerpo del IIFE. Usarlo en el controlador de eventos en la línea 7 crea un cierre. La memoria asignada para count no se liberará hasta que se elimine el detector de eventos registrado en la línea 5.

No se hace referencia a la variable del element (línea 3) excepto para agregar el detector de eventos en la línea 5 para que se libere después de que el IIFE se ejecute hasta su finalización.

A veces, los IIFE devuelven valores útiles o interactúan con su contexto principal para exponer datos o (más comúnmente) métodos que usan datos privados en el ámbito adjunto. Por ejemplo:

/ **
* Produce una cadena de tipo correctiva para el valor `v`.
* *
* @param {*} v – El valor a probar.
* /
var classify = (function () {
var FUNCTION_NAME_RE = / ^ function ([^ \ s \ (] +) \ (/;
var _classify = {} .toString.call.bind ({}. toString);

función de retorno clasificar (v) {
if (v === nulo) {
devuelve ‘nulo’;
}

if (v === indefinido) {
volver ‘indefinido’;
}

var c = _classify (v) .match (/ (. *) \] $ /) [1] .toLowerCase ();

if (c === ‘número’ && isNaN (v)) {
devuelve ‘nan’;
}

if (c === ‘objeto’) {
var C = v.constructor;

if (C.name) {
return C.name.toLowerCase ();
} más {
var m = FUNCTION_NAME_RE.exec (C);
si (m) {
devuelve m [1] .toLowerCase ();
}
}
}

volver c;
};
} ());

var ahora = nueva Fecha ();
clasificar (ahora);
// → ‘fecha’

función CustomType () {
// …
}

var customInstance = new CustomType ();

clasificar (customInstance);
// → ‘tipo personalizado’

FUNCTION_NAME_RE (línea 7) y _classify (línea 8) son privadas para el cierre creado por el IIFE. La expresión de función declarada en la línea 10 se devuelve para su uso en el ámbito externo del IIFE (línea 6). Estos tres valores (en otras palabras, todo el cuerpo del IIFE) continúan existiendo incluso después de que el IIFE se ejecuta hasta su finalización y se saca de la pila. (Si el valor de retorno de IIFE se hubiera ignorado, es decir, no se hubiera capturado en una variable en la línea 6, los tres valores se habrían liberado ya que no habría nada que se aferrara al alcance incluido).

† Se puede nombrar un IIFE, pero el nombre solo se puede usar dentro del IIFE mismo (para hacer llamadas recursivas, por ejemplo). No se puede llamar a IIFE desde fuera de sí mismo.

No, los IIFE no permanecen en la pila de funciones, se eliminan, una vez que llegan a una declaración de devolución o al final del bloque de funciones,

Explicación

Cuando el motor de JavaScript subyacente ve una expresión de función o una declaración de función, crea un nuevo alcance en la pila de funciones, lo ejecuta y devuelve lo que sea retornable, lo mismo ocurre con los IIFE, hasta que no hay nada más que hacer y el programa vuelve a flujo de control principal en funcionamiento.

Ahora, lo que sucede con los datos y el procedimiento dentro de sus IIFE, se convierten en código muerto e inaccesibles,

De wikipedia: En la programación de computadoras, el código muerto es una sección en el código fuente de un programa que se ejecuta pero cuyo resultado nunca se usa en ningún otro cálculo. La ejecución de código muerto desperdicia tiempo de cálculo y memoria.

Solución: intente hacer referencia a sus IIFE como:

funciona algo () {
// crea tu alcance local
var iife = (function () {
// realiza una agenda oculta

});
// llame a su alcance local
vida ();

// Eliminar todo el procedimiento, después de estar seguro de que ya no lo necesita
eliminar vida
}

Nota: Este es solo un ejemplo tonto.