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 .
- ¿Cómo obtengo un límite superior para T (n) = T (n / 2) + n?
- ¿Es necesaria la lógica equitativa en informática?
- ¿Travel seles man proplem es np o np completo o np difícil?
- ¿Cuál es su problema (s) abierto (s) favorito (s) en Machine Learning desde la perspectiva teórica de un científico de la computación?
- Cómo calcular el número de subsecuencias distintas de una palabra dada de una longitud dada
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.