¿Dónde usas los cierres en JavaScript?

El cierre es una herramienta poderosa en JavaScript. Se usa comúnmente en lenguajes de programación funcionales, pero a menudo se malinterpreta. Al igual que otros fundamentos de JavaScript, es necesario comprender los cierres para escribir scripts expresivos, concisos y mantenibles.

¿Qué es un cierre?

A primera vista, un cierre es simplemente una función definida dentro de otra función. Sin embargo, el poder de los cierres se deriva del hecho de que la función interna recuerda el entorno en el que se creó. En otras palabras, la función interna tiene acceso a las variables y parámetros de la función externa.

¿Cómo se ve?

A continuación se muestra un ejemplo de cierre (cortesía de Mozilla):

12345678
function pam () {var name = “Pam Beesly”; función displayName () {alert (nombre); } displayName ();} pam ();

Nuestra función externa, pam , hace tres cosas:

  1. Definir una variable local, name
  2. Definir una función, displayName
  3. Call displayName

displayName no define ninguna variable local, pero puede alertar el name porque el name se ha definido en el ámbito en el que se creó el cierre, el de su función externa.

Los cierres pueden hacer más que solo leer las variables locales de sus funciones externas: también pueden sobrescribirlas. Observa a continuación:

12345678910111213
function pam () {var name = “Pam Beesly”; función displayName () {alert (nombre); } función setName (newName) {name = newName; } nombre para mostrar(); setName (“Pam Halpert”); displayName ();} pam ();

Como podemos ver, los cierres son capaces no solo de leer, sino también de manipular las variables de sus funciones externas.

Fábricas de funciones

Un uso poderoso de los cierres es usar la función externa como una fábrica para crear funciones que de alguna manera están relacionadas.

123456789101112
función dwightJob (título) {función de retorno (prefijo) {prefijo de retorno + ” + título; };} var sales = dwightJob (‘Vendedor’); var manager = dwightJob (‘Manager’); alert (sales (‘Top’)); // Top Salesmanalert (manager (‘Asistente de la Regional’)); // Asistente del Regional Manageralert (manager (‘Regional’)); // Administrador regional

El uso de cierres como fábricas de funciones es una excelente manera de mantener su JavaScript SECO. Cinco poderosas líneas de código nos permiten crear cualquier número de funciones con propósitos similares pero únicos.

Funciones privadas de espacios de nombres

Muchos lenguajes orientados a objetos proporcionan la capacidad de declarar métodos como públicos o privados. JavaScript no tiene esta funcionalidad incorporada, pero sí permite emular esta funcionalidad mediante el uso de cierres, lo que se conoce como patrón de módulo.

1234567891011121314151617181920212223242526
var dwightSalary = (function () {var salario = 60000; función changeBy (cantidad) {salario + = cantidad;} return {raise: function () {changeBy (5000);}, lower: function () {changeBy (-5000 );}, currentAmount: function () {return salarry;}};}) (); alert (dwightSalary.currentAmount ()); // $ 60,000dwightSalary.raise (); alert (dwightSalary.currentAmount ()); // $ 65,000dwightSalary.lower (); dwightSalary.lower (); alert (dwightSalary.currentAmount ()); // $ 55,000dwightSalary.changeBy (10000) // TypeError: undefined no es una función

El uso de cierres para las funciones privadas del espacio de nombres mantiene limpios los espacios de nombres más generales, evitando colisiones de nombres. Ni la variable de salary ni la función changeBy están disponibles fuera de dwightSalary . Sin embargo, raise , lower y currentAmount tienen acceso a ellos y pueden ser llamados en dwightSalary .

Estos son algunos usos populares para cierres. Seguramente encontrará cierres utilizados para otros fines, pero estas son un par de formas simples de incorporar cierres en su código de una manera inmediatamente útil.

Puedes encontrar la publicación original aquí.