JavaScript incluye conceptos como alcance (alcance), cadena de alcance (cadena de alcance), contexto de ejecución (contexto de ejecución), objeto activo (objeto activo), alcance dinámico (alcance dinámico) y cierre (cierre). Para comprender estos conceptos, los analizamos desde aspectos estáticos y dinámicos.
Primero, escribamos una función simple para hacer un ejemplo:
La copia del código es la siguiente:
función add (num1, num2) {
var sum = num1 + num2;
suma de retorno;
}
Definimos una función ADD con dos parámetros formales.
Aspectos estáticos:
Al crear una función ADD, el motor JavaScript creará una cadena de alcance de la función ADD, y esta cadena de alcance apunta al contexto global. Si usa representaciones gráficas, se muestra la siguiente figura:
Como se puede ver en la figura anterior, cuando se crea la función Agregar, se ha creado la cadena de alcance, por lo que podemos sacar una conclusión de que la cadena de alcance de la función se crea cuando se crea la función, en lugar de un período de ejecución dinámica. Echemos un vistazo a lo que sucede durante la ejecución dinámica.
Aspectos dinámicos:
Al ejecutar la función ADD, JavaScript creará un contexto de ejecución, que contiene toda la información requerida durante el tiempo de ejecución de la función ADD. Ejecutar el contexto también tiene su propia cadena de alcance. Cuando la función se está ejecutando, el motor JavaScript inicializará primero la cadena de alcance del contexto de ejecución desde la cadena de alcance de la función Agregar, y luego el motor JavaScript creará un objeto activo, que contiene todas las variables locales, parámetros y esta y otras variables durante la función de ejecución de la función.
Si se describe la imagen, lo que sucede durante el tiempo de ejecución dinámico de la función ADD, se puede describir en la siguiente figura:
Como se puede ver en la figura anterior, el contexto de ejecución es un concepto dinámico. Se crea cuando la función se está ejecutando. Al mismo tiempo, el objeto activo objeto también es un concepto dinámico. Se hace referencia por la cadena de alcance del contexto de ejecución. Por lo tanto, se puede concluir que tanto el contexto de ejecución como el objeto activo son conceptos dinámicos, y la cadena de alcance del contexto de ejecución es inicializada por la cadena de alcance de la función.
Lo anterior habla sobre el alcance del alcance de la función y el contexto de ejecución. Hablemos sobre el problema del alcance dinámico. Cuando JavaScript pasa con declaraciones, las cláusulas de captura de try-captura y los métodos de evaluación, el motor JavaScript cambiará dinámicamente el alcance del contexto de ejecución. Echemos un vistazo con un ejemplo:
La copia del código es la siguiente:
función initui () {
con (documento) {// ¡Evite!
var bd = cuerpo,
enlaces = getElementsBytagName ("A"),
i = 0,
len = links.length;
while (i <len) {
actualización (enlaces [i ++]);
}
getElementById ("go-btn"). onClick = function () {
comenzar();
};
bd.classname = "activo";
}
Al ejecutar la función initui anterior, JavaScript creará dinámicamente un alcance correspondiente correspondiente a la instrucción With y la colocará en el extremo frontal de la cadena de alcance del contexto de ejecución. El proceso anterior se puede describir vívidamente a través de la figura a continuación. El área marcada roja a continuación muestra el alcance generado por la declaración con la declaración.
Finalmente, echemos un vistazo al cierre más misterioso de JavaScript. Los cierres son en realidad una función en JavaScript. El cierre se crea durante el tiempo de ejecución de la función. Tomemos un ejemplo para ver:
La copia del código es la siguiente:
function asigneVents () {
var id = "xdi9592";
document.getElementById ("save-btn"). onClick = function (event) {
saveDocument (id);
};
}
Cuando se ejecuta la función de asignación anterior, se creará un cierre y este cierre se referirá a la variable de identificación en el alcance de Asignaciones de asignación. Si, según el lenguaje de programación tradicional, ID es una variable almacenada en la pila. Cuando se ejecuta la función, la identificación desaparece, entonces, ¿cómo se puede hacer referencia nuevamente? Obviamente, JavaScript adopta otra forma aquí. Echemos un vistazo a cómo JavaScript implementa los cierres. Al ejecutar la función AsignationEvents, el motor JavaScript creará una cadena de alcance del contexto de ejecución de la función AsignationEvents. Esta cadena de alcance contiene los objetos activos cuando se ejecuta los asignaciones. Al mismo tiempo, el motor JavaScript también creará un cierre, y la cadena de alcance del cierre también se referirá a los objetos activos cuando se ejecute los asignaciones. De esta manera, cuando se ejecuta el asignación de Events, aunque la cadena de alcance de su propio contexto de ejecución ya no se refiere a los objetos activos, el cierre aún se refiere a los objetos activos correspondientes al tiempo de ejecución de Asignación de Events, que explica el mecanismo de cierre dentro de JavaScript. Puede usar la siguiente figura para describir la situación de la función de asignación anterior de la función de ejecución:
Como se puede ver en lo anterior, después de ejecutar la función de asignación de Events, document.getElementById ("Save-btn"). OnClick se refiere al cierre. De esta manera, cuando el usuario haga clic en Save-BTN, se activará la ejecución del cierre. Echemos un vistazo a la situación cuando se ejecuta el cierre. Como se mencionó anteriormente, los cierres en JavaScript son en realidad funciones, por lo que las situaciones de ejecución de cierre y ejecución de funciones son consistentes. La siguiente figura describirá vívidamente el cierre asociado con el evento OnClick anterior.
De la figura anterior, podemos ver que el motor JavaScript primero crea el contexto de ejecución del cierre, luego usa la cadena de alcance de cierre para inicializar la cadena de alcance del contexto de ejecución del cierre, y finalmente coloca el objeto activo correspondiente cuando el cierre se ejecuta en el extremo frontal del alcance, que verifica que el cierre es una función.