Cierre de ECMAScript

El punto más fácilmente malentendido de ECMAScript es que admite closures (cierre).

La clausura se refiere a la función léxica que incluye variables no calculadas, es decir, la función puede usar variables definidas fuera de la función.

Ejemplo simple de clausura

El uso de variables globales en ECMAScript es un ejemplo simple de clausura. Piense en el siguiente código:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

En este fragmento de código, después de que el script se carga en la memoria, no se calcula el valor de la variable sMessage para la función sayHelloWorld(). La función solo captura el valor de sMessage para su uso futuro, es decir, el programa sabe que debe verificar el valor de sMessage al llamar a la función sayHelloWorld(). sMessage se asigna cuando se llama a la función sayHelloWorld() (última línea) y muestra el mensaje "hello world".

Ejemplo de clausura compleja

Definir otra dentro de una función hace que la clausura sea más compleja. Por ejemplo:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

Aquí, la función addNum() incluye la función doAdd() (clausura). La función interna es una clausura porque obtiene los valores de los parámetros iNum1 y iNum2 de la función externa y el valor de la variable global iBaseNum. El último paso de addNum() llama a doAdd(), suma los dos parámetros y la variable global, y devuelve la suma.

El concepto importante que se debe comprender aquí es que la función doAdd() no acepta parámetros, los valores que utiliza se obtienen del entorno de ejecución.

Se puede ver que la clausura es una parte muy potente y versátil de ECMAScript, que se puede utilizar para realizar cálculos complejos.

Consejo:Como con cualquier función avanzada, se debe usar con cautela la clausura, ya que pueden volverse muy complejas.