Tengo una pregunta sobre los cierres en JavaScript. Lo que me preguntaba es que todas las funciones que usan variables de alcance externo se cierran automáticamente.
Eche un vistazo al ejemplo de código, ¿es el cierre?
const x = 2; function foo() { console.log(x); }También he leído el hilo stackoverflow que contiene dos declaraciones inconsistentes. La respuesta "no" vincula a wikipedia y establece que:
Por último, un cierre solo se distingue de una función con variables libres cuando está fuera del alcance de las variables no locales; de lo contrario, el entorno de definición y el entorno de ejecución coinciden y no hay nada que los distinga (la vinculación estática y dinámica no se pueden distinguir porque los nombres se resuelven en los mismos valores).
Pero hay puntos aparentemente válidos en los comentarios del usuario TJ Crowder.
Esto puede o no ser cierto para otros lenguajes, pero en JavaScript, todas las funciones son cierres. Es intrínseco a ellos, en JavaScript. No hay nada especial en los cierres sobre otros contextos que los distinga de las funciones que solo cierran sobre el contexto global. Ver §9.2.5 - FunctionCreate y sus usos para más detalles.
Todos son cierres (en JS) porque el mecanismo mediante el cual funcionan las variables globales en JavaScript es exactamente el mismo mecanismo mediante el cual funciona el cierre sobre variables de otros contextos. No hay distinción, en absoluto. Esta distinción semántica de "funciones con variables libres" frente a "cierres" puede o no ser válida para lenguajes que no conozco tan bien como JavaScript, y como dije en mi respuesta, generalmente no los llamamos cierres a menos que usted Los estamos usando para acceder a algo no global. Pero eso no significa que no sean cierres. :-)
Volviendo al primer fragmento de código, básicamente "foo" tendría que devolver la función que luego registra la consola. ¿O aún no sería un cierre y la variable "x" debería haberse movido al cuerpo de foo?
¿Como esto?
function foo() { const x = 2; return () => console.log(x); }Estoy confundido.
Le sugiero, si no lo hizo, que consulte los documentos de MDN Docs que son bastante exhaustivos sobre los cierres (y con muchos ejemplos).
En el primer párrafo de la página vinculada, puede encontrar una respuesta a su pregunta:
En JavaScript, los cierres se crean cada vez que se crea una función , en el momento de la creación de la función.