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’);
- Cómo vincular su código HTML de un autoresponder con un formulario diseñado con Adobe Muse
- Como desarrollador front-end, ¿qué pasos puedo tomar y qué herramientas puedo usar para examinar cómo otras empresas construyen su arquitectura?
- ¿Un desarrollador front-end necesita aprender más lenguajes como C, etc. para comprender algoritmos fundamentales o está bien si puede abrirse camino a través de HTML, CSS, JS, etc.?
- ¿Cuál es el mejor servicio de desarrollo de WordPress en India?
- ¿Qué es el estado?
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.