Estoy tratando de comprender las reglas de alcance de JavaScript. Lo que he leído en los libros de texto y la documentación es confuso.JavaScript Ámbito y contexto de ejecución
Me parece que JavaScript es un lenguaje de ámbito estático (o léxico): al intentar vincular un nombre de variable a una variable (definición), se utiliza la estructura léxica del código.
Un contexto de ejecución parece ser similar a un marco de pila en la pila de llamadas. Cada contexto de ejecución tiene un objeto variable sobre el que se definen todas las variables locales (de la función asociada). Estos objetos variables se vinculan entre sí para proporcionar una 'cadena de alcance' desde el objeto variable en la parte superior de la pila hasta el objeto variable en la parte inferior de la pila (el objeto ventana). Esta cadena de ámbito se busca de arriba a abajo al vincular los nombres de las variables a las variables. Esto es muy similar a los lenguajes de ámbito estático como C/C++/Java.
Parece haber una diferencia importante con respecto a C/C++/Java: es posible acceder a una variable definida en una función cuyo marco de pila ya no está en la pila de llamadas, como se muestra en el siguiente ejemplo:
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
¿Tengo este derecho? ¿Hay otros problemas que deba conocer?
Gracias de antemano
Un mensaje publicado muy completo HN hoy que toca esto: [¿Cuál es el contexto de ejecución y pila en JavaScript?] (Http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
Esto se llama * cierre *. La función que asignó a 'printColor' tiene acceso a todas las variables definidas en' changeColor' incluso después de que la función finalizó. No sé cómo es esto en C. –
@FelixKling casi. sin embargo, changeColor también se define en el alcance global, por lo tanto, su alcance nunca será basura. – webduvet