¿Es un cierre una función o el entorno en el que se definió dicha función?

Es ambos . Un cierre es una referencia a una función agrupada con el entorno que estaba presente cuando se creó el cierre, de modo que cuando el cuerpo de la función se refiere a una variable que estaba vinculada fuera de la definición de la función, el intérprete aún puede buscar esa variable. Por ejemplo (usando la sintaxis de estilo JavaScript):

función f (x) {función de retorno g (y) {retorno x + y; }; };
sumar 5 = f (5);
print (add5 (10)); // imprime 15
imprimir (x); // sería un error

Cuando llamo a f (5) , la function g(y) { return x + y; }; expresión function g(y) { return x + y; }; function g(y) { return x + y; }; se evalúa, con la variable x en alcance. Entonces, para producir un cierre, el sistema debe producir un puntero al código para g , junto con un mapeo de entorno x a 5 .

Luego, cuando se llama a add5 (10) , add5 se refiere a ese cierre, por lo que cuando evalúa x + y , el entorno asigna x a 5 (desde el cierre) yy a 10 (desde el argumento hasta g ).

La siguiente línea, print (x) , es un error, porque x ya no está dentro del alcance en ese punto del código. La llamada a imprimir no tiene x en su entorno.


Todo esto es necesario para mantener el alcance léxico, lo que equivale a decir que cada variable de referencia apunta al lugar de cierre más cercano donde se define ese nombre de variable. Supongamos que seguimos el ejemplo anterior con este código:

función f2 (x) {return add5 (x); }
imprimir (f2 (100));

Esto imprimirá 105, no 200, porque el cuerpo de g se refiere a la x unida en f , no a la x en f2 . Son dos variables distintas.

¿Por qué hacer esto? Mantiene una propiedad muy importante: puede saber a qué enlace se referirá cada variable en una función, simplemente mirando el código fuente en y alrededor de la definición de esa función. La alternativa ( alcance dinámico ) es lo que obtendría si los cierres no incorporaran entornos; en ese caso, las variables se referirían a cualquier enlace presente cuando se llama a su función, lo que significa que el código de llamada puede alterar el significado de su función , lo que generalmente no es una buena idea.

More Interesting

¿Existe una función que defina la relación entre el dígito inicial de un entero y el número de términos cuando se agrega infinitamente?

¿Cuál es la relevancia de la computación cuántica para el problema NP = P?

¿Cuáles son las aplicaciones de los derivados en informática?

¿Por qué una máquina Turing puede ejecutar todos los algoritmos informáticos?

¿Cómo sirven las matemáticas como base para la informática teórica?

¿Cómo puedo calcular el número esperado de aciertos de caché?

¿Cómo ayuda una base sólida en matemáticas discretas en la programación de computadoras?

¿La mayoría de los programadores encuentran las matemáticas fáciles?

Cómo detectar si el siguiente cuerpo de cierta longitud y altura que gira en un punto de anclaje toca una posición particular

¿Cuáles son algunos de los mejores libros de matemáticas discretas para programadores?

Si el punto (3, -4) divide la línea entre el eje x y el eje y en la relación 2: 3, ¿cuál será la ecuación lineal?

En algoritmos, proporcione una matriz incremental del entero (-200, ... 0, ... 500) y quite un número. ¿Cuál es el algoritmo eficiente para encontrar el número que falta?

Sé que la función de devolución de llamada se ejecuta de forma asincrónica, pero ¿por qué es eso?

¿Por qué el problema indecidible en las máquinas de Turing es interesante desde un sentido práctico?

¿Hay ejemplos fractales que usen entradas aleatorias externas de alguna manera en las iteraciones?