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

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 stack?
  • ¿Es la function la que se devuelve?
  • ¿Es el scope de la function externa?
  • ¿Es el scope de la function interna (devuelta)?
  • ¿Es tal vez el concepto de mantener las variables en el marco de la stack después de devolver la function?

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

  • ReferenceError: la variable no está definida
  • La function de llamada no funciona (bucle infinito, Javascript)
  • ¿Por qué JavaScript a veces se ve como un lenguaje de bajo nivel?
  • ¿Cuál es la diferencia entre el scope de un object y su context en javascript?
  • Definición fácil de entender de "evento asíncrono"
  • ¿Qué es la serialization de datos?
  • La variable local Javascript declara
  • 7 Solutions collect form web for “¿A qué se refiere exactamente el "cierre" en JavaScript?”

    De los cierres de JavaScript

    Dos resúmenes de una oración:

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

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

    Un muy buen artículo sobre cierres

    Cierres Javascript

    Un "cierre" es una expresión (generalmente una function) 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 function y expresiones de function que están dentro de los cuerpos de function de otras funciones. Y que esas funciones internas tienen acceso a todas las variables locales, parameters y funciones internas declaradas dentro de su (s) function (es) externa (s). Se forma un cierre cuando una de esas funciones internas se hace accesible fuera de la function en la que estaba contenida, de modo que puede ejecutarse después de que la function externa haya retornado. En ese punto, todavía tiene acceso a las variables locales, los parameters y las declaraciones de funciones internas de su function externa. Esas variables locales, declaraciones de parameters y funciones (inicialmente) tienen los valores que tenían cuando se devolvió la function externa y pueden interactuar con la function interna.

    Un buen ejemplo aquí

    JavaScript, hora de cerrar cierres

    Es una function que "contiene" una reference o references 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 copyn el valor de i, tienen una reference a i, de modo que cuando llamamos a las funciones usan el valor actual de i, que es 3.

    Aquí hay una explicación gráfica.

    Para mí, los cierres en JS te permiten hacer lo siguiente.
    "a" permanece disponible en la function 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 templates JS)

    Hasta donde puedo decir, un cierre es una function definida dentro de otra function que sobrevive al scope de la function 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 function, así como la variable de la function padre, msg , sobreviven al scope de la delay_message function delay_message .

    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 function que opere en las variables a y b

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

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

    Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.