Gestión y cierres de memoria de JavaScript.

Principio de ejecución de JavaScript

Si tenemos el siguiente fragmento de código, ¿cómo se ejecuta en JavaScript?

1. Inicialice el objeto global primero

El motor js creará un objeto global en la memoria del montón antes de ejecutar el código: Objeto Global (GO), que es una ventana para el entorno del navegador y global para la variable global en el entorno del nodo, similar a la ventana en el navegador, pero no Se recomienda su uso en el código, y el objeto de proceso proporciona información y métodos de control del proceso actual de Node.js.
* Todos los ámbitos del objeto pueden acceder al contenido del objeto;
* Contendrá fecha, matriz, cadena, número, setTimeout, setInterval, etc.; *
También hay un atributo de ventana que apunta a sí mismo

inserte la descripción de la imagen aquí

2. Cree un contexto de ejecución para cada bloque de alcance y colóquelo en la pila de contexto de ejecución.

Hay uno dentro del motor js 执行上下文栈(Execution Context Stack,简称ECS), que es la pila de llamadas para ejecutar código.
Entonces, ¿a quién va a ejecutar ahora? Lo que se ejecuta es un bloque de código global:
inserte la descripción de la imagen aquí
entre ellos, esta es la referencia del contexto actual.

  • El bloque de código global creará un contexto de ejecución para la ejecución Global Execution Context(GEC), el bloque de código de función creará el contexto de ejecución y el bloque de código global también creará el contexto de ejecución. Después de es6, el alcance a nivel de bloque también creará el contexto de ejecución. cuando se crea el contexto de ejecución, se utilizará. Colóquelo en la pila de contexto de ejecución y luego ejecute el código;
  • El contexto de ejecución se colocará en la pila de contexto de ejecución para su ejecución;
    el contenido del contexto de ejecución en la pila de contexto de ejecución contendrá dos partes:
    • La primera parte: antes de ejecutar el código, en el proceso de convertir el analizador a AST, las variables, funciones, etc. definidas globalmente se agregarán al GlobalObject. Este proceso también se conoce como elevación de alcance variable. Tenga en cuenta que la declaración de función se promueve y asigna, y su prioridad es mayor que la de la variable declarada por var, mientras que la variable declarada por var solo se promueve y no se asigna.
      inserte la descripción de la imagen aquí
      Entre ellos, el contenido impreso de foo es la cadena abc.

    • La segunda parte: durante la ejecución del código, cree un contexto de ejecución, asigne valores a variables o ejecute otras funciones;

Resumen de los principios de ejecución de JavaScript

Enlace de referencia: Demostración de cambios en la pila de contexto durante la ejecución
1. Inicializar el objeto global
2. Analizar el código escrito Durante el proceso de análisis, se deben mejorar las variables var y las funciones declarativas.
3. Ejecute el código. Si se encuentra una llamada de función durante la ejecución, cree un contexto para la función y colóquelo en la pila de contexto, y cada contexto de ejecución se asociará con un VO (objeto variable, objeto variable), variable y Las declaraciones de funciones se agregarán a este objeto VO.

Nota: Si la función está anidada con varias capas de funciones, solo la primera capa se interpreta durante la inicialización. Si hay funciones dentro durante la ejecución, se interpretará nuevamente y luego se ejecutará. -> JavaScript es un lenguaje interpretado, 边解释边执行代码. Cuando un navegador carga código JavaScript, interpreta el código línea por línea y lo ejecuta inmediatamente. Esto difiere de los lenguajes compilados como C++, que requieren que el código se compile en lenguaje de máquina antes de que el programa pueda ejecutarse.

Información complementaria 1: Comprensión de los objetos VO (objeto variable)
inserte la descripción de la imagen aquí
Información complementaria 2: VO, GO (objeto global), AO (objeto de activación)
inserte la descripción de la imagen aquí

Enlace de referencia: enlace

cadena de alcance

La cadena de alcance en realidad se guarda en la función, que se determina cuando se define el código y no tiene nada que ver con la ejecución de la función, por lo que para encontrar variables, solo necesita mirar el orden en que se escribe el código. escrito, y no tiene nada que ver con cuando se ejecuta.

小技巧: Al dividir el punto, puede ver el contenido del alcance de la línea de depuración actual.
inserte la descripción de la imagen aquí


gestión de la memoria

No importa qué tipo de lenguaje de programación, se le debe asignar memoria durante la ejecución del código. La diferencia es que algunos lenguajes de programación necesitan administrar la memoria manualmente y algunos lenguajes de programación pueden ayudar automáticamente. nosotros gestionamos la memoria.

No importa qué método se utilice para administrar la memoria, la administración de la memoria tendrá el siguiente ciclo de vida:

  • El primer paso: asignar y solicitar la memoria que necesita (solicitud);
  • El segundo paso: usar la memoria asignada (almacenar algunas cosas, como objetos, etc.);
  • Paso 3: suéltelo cuando no esté en uso;

Algoritmos de GC comunes:

Enlace de referencia: enlace

  1. recuento de referencia
  2. Eliminación de marcas (algoritmo de accesibilidad): actualmente el más utilizado, V8 también usa esto
    inserte la descripción de la imagen aquí

Eliminar la relación de referencia estableciéndola en nula

Cierre

Enlace de referencia: Cierre

La definición de cierre en informática es que un cierre es en realidad una estructura que consta de una función y un entorno asociado.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/yexudengzhidao/article/details/131865834
Recomendado
Clasificación