programacion meaning functions closure javascript closures definition

meaning - ¿A qué se refiere exactamente el "cierre" en JavaScript?



nested functions javascript (7)

Considere el siguiente código que crea un cierre con las variables a y b

closure=(function(){ var a=3 var b=5 return function(operation){ return operation(a,b) } }()) // The variables a and b are now part of the closure (They are retained even after the outer function returns) closure(function(x,y){return x+y}) // outputs 8 closure(function(x,y){return x*y}) // outputs 15`

Este cierre particular ahora puede tomar cualquier función que opere en las variables a y b

Entiendo lo que son los cierres, pero estoy teniendo problemas para entender exactamente a qué se refiere el término " closure . He visto el término utilizado en muchos sitios web, pero rara vez coinciden en la definición real del mismo.

  • ¿Son las variables que se mantienen en el marco de la pila?
  • ¿Es la función la que se devuelve?
  • ¿Es el alcance de la función externa?
  • ¿Es el alcance de la función interna (devuelta)?
  • ¿Es tal vez el concepto de mantener las variables en el marco de la pila después de devolver la función?

¿Puede alguien decirme exactamente a qué se refiere el closure ?


De los cierres de JavaScript

Dos resúmenes de una oración:

Un cierre son las variables locales para una función, se mantienen activas después de que la función ha regresado, o

Un cierre es un marco de pila que no se desasigna cuando la función regresa. (¡como si un ''stack-frame'' estuviera malloc''ed en lugar de estar en la pila!)

Un muy buen artículo sobre cierres

Cierres Javascript

Un "cierre" es una expresión (generalmente una función) que puede tener variables libres junto con un entorno que vincula esas variables (que "cierra" la expresión).

La explicación simple de un Cierre es que ECMAScript permite funciones internas; definiciones de función y expresiones de función que están dentro de los cuerpos de función de otras funciones. Y que esas funciones internas tienen acceso a todas las variables locales, parámetros y funciones internas declaradas dentro de su (s) función (es) externa (s). Se forma un cierre cuando una de esas funciones internas se hace accesible fuera de la función en la que estaba contenida, de modo que puede ejecutarse después de que la función externa haya retornado. En ese punto, todavía tiene acceso a las variables locales, los parámetros y las declaraciones de funciones internas de su función externa. Esas variables locales, declaraciones de parámetros y funciones (inicialmente) tienen los valores que tenían cuando se devolvió la función externa y pueden interactuar con la función interna.

Un buen ejemplo aquí

JavaScript, hora de cerrar cierres


Es una función que "contiene" una referencia o referencias a algo en otro ámbito. Por ejemplo:

var myArrayOfFunctions = []; for(var i = 0; i<3: i++) { //Note how the function being defined uses i, //where i lives in the parent''s scope, this creates a closure myArrayOfFunctions[i] = function(a) { return a + i;} } myArrayOfFunctions[0](5); //Prints 8 WTF! myArrayOfFunctions[1](5); //8 again myArrayOfFunctions[2](5); //Well, this 8 was expected

Esto sucede porque cuando las funciones son "creadas", no copian el valor de i, tienen una referencia a i, de modo que cuando llamamos a las funciones utilizan el valor actual de i, que es 3.

Aquí hay una explicación gráfica.


Esencialmente, un cierre es un cuerpo de función cerrado sobre sus identificadores (variables) dentro de su entorno local.


Hasta donde puedo decir, un cierre es una función definida dentro de otra función que sobrevive al alcance de la función principal. Un ejemplo común son las devoluciones de llamada:

function delay_message(msg) { setTimeout(function closure() { alert(msg); }, 1000); }

En este caso, el function closure anterior se define dentro del cuerpo de delay_message , pero la definición de la función, así como la variable de la función padre, msg , sobreviven al alcance de la delay_message función delay_message .


Para mí, los cierres en JS te permiten hacer lo siguiente.
"a" permanece disponible en la función interna cuando se agrega a "b" aunque se declara afuera.

function adder(a){ return function(b){ return a + b; }; } var add5 = adder(5); alert( add5(10) );

Para un uso extremo de cierres JS, puede echar un vistazo al código fuente de la biblioteca PURE (un motor de plantillas JS)


Un cierre es un valor de función creado a partir de una declaración de función anidada o expresión de función (es decir, expresión lambda) cuyo cuerpo contiene una o más referencias a variables declaradas en un ámbito externo (pero no global).