Dominación de JavaScript 1: conceptos críticos | Steven Hancock | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Dominación de JavaScript 1: conceptos críticos

teacher avatar Steven Hancock, Founder All Things JavaScript

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción a conceptos críticos

      1:31

    • 2.

      El entorno de ejecución de JavaScript

      6:13

    • 3.

      Cómo entender el motor JavaScript

      6:07

    • 4.

      El montón de memoria y la pila

      13:54

    • 5.

      Cómo entender la colección de basura

      7:03

    • 6.

      Cómo eliminar a los oyentes de eventos para ayudar con la colección de basura

      5:52

    • 7.

      Cómo entender el bucle de eventos

      7:34

    • 8.

      El entorno de tiempo de ejecución de nodos

      2:25

    • 9.

      Empieza con ejercicios: exploración de pila de llamada y bucle

      3:01

    • 10.

      Fin de ejercicio: exploración de pila de llamada y bucle

      4:06

    • 11.

      Cómo evoluciona JavaScript

      8:23

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

77

Estudiantes

--

Proyectos

Acerca de esta clase

Este curso representa la primera sección en el dominio de JavaScript. En este curso cubriremos conceptos críticos. Este curso puede no profundizar en el lenguaje JavaScript, pero en realidad responderá a muchas preguntas sobre cómo funciona JavaScript y por qué suceden ciertas cosas. Cada programador de JavaScript superior debería entender estos conceptos básicos pero importantes.

En este curso cubrimos los siguientes conceptos críticos:

  • El entorno de ejecución de JavaScript
  • El motor JavaScript
  • El montón de memoria y la pila
  • Colección de basura
  • Cómo eliminar a los oyentes de eventos para ayudar con la colección de basura
  • El bucle de eventos
  • El entorno de tiempo de ejecución de nodos
  • Cómo evoluciona JavaScript

Comprender estos conceptos críticos son importantes para ponerte en la parte superior de todos los desarrolladores de JavaScript, así que entra y comience.

Prerrequisitos y configuración: los requisitos previos para este curso son bastante básicos. Necesitas saber cómo entrar en ejecución JavaScript. Esto ayuda a entender algunos conceptos básicos sobre el idioma para que puedas aplicar los conceptos enseñados.

La configuración es bastante fácil. No estamos usando ninguna bibliotecas o nada como ese, así que todo lo que necesitarás es un editor de texto y un navegador. La mayoría del código JavaScript que escribimos se ejecutará en un navegador. Hay una mención de Node.js, pero el código se ejecutará en un navegador. Voy a usar Chrome.

Para un editor de código voy a usar el código de Visual Studio. Este es un editor gratuito de plataformas que es bastante popular, así que si actualmente no estás usando código visual de estudio y te gustaría durante este curso, puedes descargarlo aquí.

Una vez que hayas terminado este curso, te invito a pasar a Dominar la sección 2: fundamentos críticos.

Conoce a tu profesor(a)

Teacher Profile Image

Steven Hancock

Founder All Things JavaScript

Profesor(a)

I have 20+ years experience in training and product development and 15+ years using JavaScript. I started learning JavaScript when it was a new language used for minor affects on web pages. The growth and ubiquitous nature of JavaScript both excites and inspires me.

Currently I am the President and Lead Trainer of All Things JavaScript, a resource for anyone and everyone that hopes to increase their JavaScript skills. Our goal is to assist in the journey from JavaScript novice to expert.

I have been the co-owner and President of Rapid Intake, an eLearning firm. The company was an ideal place to put my training and development skills to work. While there I managed all development and professional service related activities. I was heavily involved in the initial development ... Ver perfil completo

Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Conceptos críticos: Bienvenido a esta sección sobre conceptos críticos en JavaScript. En esta sección, vamos a tratar lo que creo que son conceptos críticos sobre el lenguaje y cómo funciona JavaScript. Ahora algunos de ustedes pueden querer adelantar dos secciones que se centran más en el aspecto del lenguaje de JavaScript. Pero yo instaría a los pacientes, estos conceptos son críticos. Ahora bien, al iniciar en esta sección, algunos de los conceptos pueden parecer básicos porque lo son. Pero incluso si llevas tiempo trabajando con JavaScript, estoy seguro de que aprenderás algo. Así que quédate con él. Ahora bien, ¿por qué son críticos estos conceptos? ¿ Por qué es importante entender cómo funciona el lenguaje? Porque una parte crítica de la comprensión de cualquier buen desarrollador es saber por qué haces ciertas cosas. La y permite ajustar patrones o código para adaptarse a sus necesidades específicas. El y facilitar el pensamiento crítico. Y estos conceptos proporcionan el por qué para muchas cosas que hacemos en JavaScript de las que hablaremos más adelante. De hecho, como parte de secciones posteriores, es posible que desee volver y volver a visitar algunos de estos temas, como el bucle de eventos cuando se trata de código asincrónico. Por lo que es importante pasar algún tiempo hablando del motor JavaScript, la pila de llamadas, el montón de memoria. El hecho de que JavaScript sea un solo subproceso, el entorno de tiempo de ejecución y el bucle de eventos. Entonces saltemos a ello. 2. Entorno de tiempo de ejecución: Para que podamos hacer uso de JavaScript, necesitamos un entorno donde se ejecute. Ahora, JavaScript no requiere muchas herramientas para escribir código. De hecho, sólo podemos abrir un sencillo editor de texto y comenzar a escribir JavaScript. Pero para que ese código tenga sentido o haga cualquier cosa, necesitamos que el código esté disponible para un entorno de tiempo de ejecución de JavaScript. Ahora hay dos entornos de tiempo de ejecución principales que conforman la mayor parte del uso de JavaScript, el navegador y NodeJS. Así podremos tener JavaScript ejecutándose y completar alguna tarea usando ya sea el navegador o nodo. Ahora bien, estos dos no son los únicos entornos que podríamos usar, sino que son los más importantes y los más prevalentes. Ahora hay algunas similitudes entre nodo y navegadores, y luego hay algunas diferencias. Hablemos de esos brevemente. Primero, tanto un navegador como un nodo es simplemente una aplicación. En cada caso, necesitan ser instalados en tu computadora para poder utilizarlos. Instalamos Node antes en el curso. Cuando inicio un navegador, en este caso Chrome, estoy iniciando esa aplicación desde mi computadora. Ahora lo mismo es cierto con nodo. Simplemente lo usamos de manera diferente. Necesitamos usarlo desde el terminal o símbolo del sistema. Y no solemos usar una interfaz GUI. Por ejemplo, puedo acceder al nodo escribiendo eso en. Y ahora tengo un prompt de nodo. Así es como uso nodo. Otra similitud es que estas aplicaciones, es decir, tanto el navegador como el nodo, están escritas con el mismo lenguaje informático. Ahora en el caso de Chrome y la mayoría de los navegadores por ese hecho, el núcleo de esa aplicación está escrito en C plus plus. La GUI suele ser un lenguaje diferente, pero el núcleo es C plus plus. Ahora, el núcleo de NodeJS también está escrito en C plus plus con algún código JavaScript que actúa como envoltorio para algunos de los comandos que usamos. El código. Esas dos aplicaciones están escritas en el navegador y el nodo es muy similar, pero eso no es lo que nos permite usar JavaScript en cada uno de esos entornos. Para que un entorno de tiempo de ejecución JavaScript permita el uso de JavaScript, necesita algo para interpretar el lenguaje, leer el JavaScript y traducirlo para la computadora. Esa pieza muy importante se llama el motor JavaScript. Tanto un navegador como un nodo requieren un motor JavaScript para poder usar JavaScript. Ahora el motor JavaScript es solo una pieza de toda la aplicación. Hay muchas otras piezas a un navegador y hay muchas otras piezas a nodo. Echemos un vistazo a un diagrama que ilustra el entorno de tiempo de ejecución para nuestro navegador. Estas son todas las piezas de las que vamos a estar hablando porque interactuamos con ellas cuando usamos JavaScript en el navegador. Entonces, si todo esto representa el navegador y lo que contiene, podemos ver que hay cosas que no están aparte del motor JavaScript, que se representa aquí arriba. A veces hacemos cosas en JavaScript que hacen uso de partes de la aplicación del navegador que no forman parte del motor JavaScript. Ahora bien, estas otras partes o piezas son algunas de las cosas que son diferentes entre un navegador y conocidas. Por ejemplo, en un navegador, interactuamos con el DOM, ampliamente representado aquí en las API web. Bueno, eso no es algo que hagamos en Node. No hay DOM que forme parte del nodo. Sin embargo conocido hace posible realizar otro tipo de tareas. Tareas que se requieren en un servidor, como escribir un archivo en un disco duro o iniciar un servidor. Esas son cosas que no podemos hacer en un navegador. Entonces hay algunas diferencias. Echemos un vistazo a otra diferencia realmente rápido. Entonces aquí en un navegador, si abro la consola, puedo mostrar ventana. Eso muestra el objeto de ventana. Este es el entorno global en el que estamos escribiendo código. Cuando estamos escribiendo JavaScript está dentro de la ventana. Y hay mucho asociado con la ventana, que podemos hacer uso. Ahora nodo no tiene ventana. Si tecleamos ventana aquí, referencia no capturada, nuestra ventana no está definida. Sin embargo, podemos escribir global. Y sí obtenemos información sobre global. Y esto sería el equivalente a Window en el lado del navegador. Ahora, claro, va a haber similitudes. Por ejemplo, puedes ver setTimeout aquí dentro de global. Settimeout también está disponible en el navegador. puede ver que no está en el motor JavaScript. En realidad es parte de la API web. Lo mismo con nodo. No es parte del motor JavaScript, pero tenemos acceso a él. Y podemos hacer algo como console.log aquí. Y al igual que podemos hacer en un navegador. Ahora, a lo largo de los siguientes temas, vamos a estar hablando de estas diferentes partes de un navegador ya que son críticas para entenderlas. Con el fin de escribir de manera efectiva, JavaScript. Node también tiene partes adicionales, pero nos centraremos principalmente en el navegador. En primer lugar, vamos a hablar del motor JavaScript. 3. Motor: En pocas palabras, el motor JavaScript es un programa que ejecuta código JavaScript. Entonces mirando nuestro diagrama, si tenemos algún código JavaScript, el motor JavaScript está a cargo. Es la única pieza que sabe qué hacer con el código. Lo traduce en algo que la computadora pueda entender. Ahora, los motores JavaScript iniciales desde el principio eran intérpretes, lo que significa que procesarían el código JavaScript línea por línea, lo convertirían en bytecode para que pudiera ejecutarse. Los intérpretes se dejan de fumar para comenzar a ejecutar el código, que es algo que se necesitaba en el entorno del navegador. Pero pueden ser más lentos en general en comparación con compilar el código. código compilado es convertir el programa código de máquina para que se ejecute optimizado. Los últimos motores JavaScript están mucho más optimizados. Utilizan una combinación de intérprete y justo a tiempo, compilación o compilador JIT para optimizar el código. Esto consigue lo mejor de ambos mundos. compilación de Jit toma frío que se puede optimizar y la compila. Por ejemplo, si una pieza de código se ejecuta mucho, se puede compilar en código de máquina. Y entonces cuando ese trozo de código sí se ejecuta, se optimiza y por lo tanto más rápido. Ahora, hay una serie de motores JavaScript. El que probablemente sea el más conocido es el motor V8. Este es el motor que se utiliza en el navegador Chrome y también en nodo. Este motor fue escrito por Google para Chrome usando C plus plus. Y es de código abierto. Probablemente sea el motor más conocido porque cuando se construyó, mejoró la velocidad de los motores JavaScript existentes. Google estaba usando JavaScript para hacer algunas cosas bastante increíbles en ese momento. Piensa en las diferentes aplicaciones de Google escritas con JavaScript. En fin, querían que fuera más performante. Entonces escribieron el motor V8 para lograr exactamente eso. Otros motores JavaScript siguieron su ejemplo con el fin de hacer que sus motores fueran más para el rendimiento también. Esta mejora en el rendimiento es importante para estar al tanto de esta idea de usar un compilador JIT con un intérprete para ayudar a optimizar el código. La razón por la que esto es importante porque hablamos de escribir código ciertas formas de hacerlo más rendimiento o evitar cosas en nuestro código que podrían hacerlo menos rendimiento. Muchas veces tiene que ver con la forma en que el motor JavaScript maneja el código y es capaz de optimizarlo. Ahora, aquí hay algunos otros motores JavaScript que puede haber encontrado. Ya mencionamos a V8 que era de código abierto, eso fue desarrollado por Google. Se utiliza en Chrome y NodeJS. Mono araña. Este fue el primer motor JavaScript, y hoy en día se usa en Firefox. Y por cierto, el primer motor JavaScript fue escrito por Brendan Eich cuando inventó JavaScript, y como dice la historia, lo hizo en diez días. Ahora, núcleo de JavaScript, eso también es código abierto y eso fue desarrollado por Apple para Safari. Entonces ese es el motor que usa Safari. Otro que probablemente deberíamos mencionar es el chakra. Y esto se usa en Microsoft Edge. Así que el motor JavaScript de Microsoft. Ahora, con todos estos diferentes motores JavaScript en diferentes navegadores, ¿cómo sabemos que el código JavaScript que escribimos funcionará de la misma manera en cada navegador? Al principio de la historia de JavaScript, esto era un problema real. Hubo diferencias. En esos días. Pasamos mucho tiempo preocupándonos por las diferencias en los navegadores. Bibliotecas como jQuery ayudan a resolver ese problema y se hicieron muy populares debido a eso. Ahora bien, debido a estas diferencias, tenía que haber un estándar y es donde entra el guión Acme. Este es un estándar que JavaScript sigue. Un script AGMA es una especificación que todos los motores JavaScript siguen ahora. Esto permite múltiples implementaciones independientes, pero asegura que nuestro código funcione igual. Por lo que cuando se realizan cambios en el estándar de guión, los indios deben ser actualizados para apoyar estos cambios. Algunas actualizaciones son más rápidas que otras. Y por eso tenemos sitios como este. ¿ Puedo usar.com que nos diga qué navegadores admiten ciertas implementaciones? Así podemos ver el historial de diferentes navegadores y cuándo empezaron a soportar módulos ES en este ejemplo. Ahora bien, por eso también hacemos uso del transpiler. Un transpiler como balbuceo, te permite escribir código usando el estándar de scripts Ekman más ligero, pero luego genera código JavaScript a un estándar más antiguo. Entonces una forma anterior de JavaScript que motores de navegador más antiguos pueden ejecutar. Esto también se puede llamar compilador porque técnicamente estás compilando código a otra forma y versión anterior de JavaScript. Bien, así que eso es suficiente sobre los motores JavaScript. Ahora necesitamos entrar más en los detalles y hablar sobre el montón y la pila de llamadas dentro de los motores. Estas dos cosas se usan con frecuencia al codificar en JavaScript, aunque quizás no lo hayas sabido. 4. El montón de memoria y la pila: Ahora vamos a sumergirnos en dos características del motor JavaScript que son importantes de entender, montón de memoria y la pila de llamadas. Estos se utilizan durante toda la ejecución de código. Primero voy a describir cada uno de ellos y luego los veremos en acción para entender mejor cómo están involucrados en la ejecución de código. Ahora, el montón de memoria, como su nombre indica, tiene que ver con la asignación de memoria. Siempre que definas una función de objeto variable, algo así en tu código, tiene que haber un lugar para almacenarla. Entonces como estas variables aquí se almacenarían en el montón de memoria. Siempre que se encuentre una declaración, como esta, el valor se coloca en el montón de memoria, y luego la ubicación de ese valor se coloca en la variable. Entonces, siempre que el código necesite ese valor o la función o lo que sea que se almacene, usa la ubicación de la memoria para buscarlo. Ahora la memoria tiene una cantidad limitada de memoria, por lo que programas complejos que tienen muchas variables y objetos anidados pueden masticar esa memoria. El motor JavaScript intenta hacer más memoria disponible al borrar datos del programa que determina que ya no son necesarios. Este proceso se llama recolección de basura. Hay cosas que puedes hacer como programador para ayudar en la recolección de basura. Y hay cosas que podrías hacer que podrían obstaculizarlo. Veremos esto con más detalle en el tema sobre recolección de basura. Pero por ahora, hablemos de la pila de llamadas. Cada vez que ejecutamos código, se usa la pila de llamadas. Es simplemente un lugar en memoria que realiza un seguimiento de la función ejecutándose y las funciones que se van a ejecutar después de eso. Entonces el orden en que se ejecutan estos comandos. Ahora, cada función se coloca encima de la función anterior. Entonces la primera función en está en la parte inferior de la pila de llamadas. Y entonces como se llaman otras funciones, se colocan encima de ella. Entonces, la pila de llamadas sigue un enfoque de primero en entrar, último en salir. Ahora tan pronto como se complete la función o comando se elimina de la pila de llamadas. Ahora, como puede ver en el diagrama, solo se representa una sola pila de llamadas. El motor JavaScript solo tiene una pila de llamadas para tratar con los comandos que se están ejecutando. Eso se debe a que JavaScript es de un solo hilo, un término del que quizás hayas oído hablar. Ahora, un solo hilo significa que el motor JavaScript solo puede ejecutar una parte del programa a la vez. Entonces la pila de llamadas trata con un comando a la vez. Y como resultado de esto, JavaScript es sincrónico. Los comandos solo se pueden ejecutar uno a la vez. Probablemente puedas ver un posible problema con esto. ¿ Y si invocamos una función que requiere mucho tiempo para ejecutarse? ¿ Cómo podemos evitar que eso bloquee otro código? Por ejemplo, queremos que un usuario pueda hacer clic en un botón y no tener que esperar dos segundos para que termine algún JavaScript antes de que pueda responder a ese botón. Ahora, nos sumergimos en cómo se maneja esto y cómo lo maneja el motor JavaScript cuando hablamos del bucle de eventos. Y esta es también la razón por la que es importante entender los patrones asíncronos de JavaScript en JavaScript. Y esa es una de las partes críticas con las que tratamos en este curso. Ahora bien, en nuestro diagrama, como pueden ver, tenemos algún código muy sencillo. Vamos a recorrerlo con el montón de memoria y la pila de llamadas ilustran cómo se usan esos para moverse por el código. Básicamente lo que estamos haciendo es que estamos declarando dos variables, a y B. Entonces tenemos una función declarada. Y entonces aquí invocamos esa función. Dentro de la función, llamamos registro de consola. Llamamos setTimeout y pasamos una función a setTimeout. El tiempo para eso es de 0 milisegundos. Y luego volvemos a llamar al registro de la consola. Entonces pasemos por esto. Primero tenemos las declaraciones de variables. Y así cada uno de esos van a ser colocados en el montón de memoria. Hay 1 segundo. Ahora no hay un orden específico en cómo se colocan en el montón. Solo necesitan una referencia dónde se encuentra ese valor. Entonces tenemos nuestra función. Y eso va a necesitar ser colocado en el montón también. Y ahí lo hemos agregado al montón de memoria. Ahora bien, si hubiera alguna variable declarada dentro de esa función, esas necesitarían ser colocadas ahí. O si hay funciones declaradas en su interior, si hay otras cosas dentro que necesitan entrar en el montón de memoria, eso tendría que suceder. Pero ahora nos encontramos. El llamado a helloworld a esa función. Loestamos invocando. Entonces el motor JavaScript toma ese código de su ubicación de memoria, y luego es capaz de comenzar a ejecutarlo usando la pila de llamadas. Entonces la función hello-world se coloca en la pila de llamadas que indica dónde estamos dentro de la ejecución del código. Entonces ahora mismo estamos dentro de la función helloworld. Llegamos al primer comando ahí dentro, y eso es una llamada a console.log. Así que nuestra consola invocando el registro de puntos y eso se coloca en la pila de llamadas. Ahora podemos completar ese comando. Y así una vez que ese comando está completo, se elimina de la pila de llamadas y podemos continuar. Y llegamos a establecer timeout y setTimeout se agrega a la pila de llamadas. Sin embargo, setTimeout es algo que forma parte de la API web, como puedes ver aquí. Entonces JavaScript no necesita hacer nada con eso. Entonces básicamente se deshace de él. Lo envía al navegador y dice, Aquí, tengo que llamar al setTimeout. Aquí está la información. Sigue adelante y cuídalo. Y luego al motor JavaScript se olvida de ello en ese momento, la API web, configuraremos un temporizador para ese setTimeout y se encargará de todo lo que necesite ser manejado con setTimeout. Pero en este punto, el motor JavaScript simplemente se olvidó de él. Ya no le preocupa. Simplemente continúa al siguiente comando, que es otro colega, console.log. Y así eso se agrega a nuestra pila de llamadas. Podemos encargarnos de eso de inmediato. Enviamos un mensaje a la consola, que pasa a ser mundo. Y entonces eso se elimina de la pila de llamadas. Y entonces en ese punto estamos al final de la función hello-mundo. Y así eso se elimina de la pila de llamadas. Ahora, puedes ver cómo la pila de llamadas podría construirse con una serie de cosas. Si tuviéramos funciones llamadas dentro de otras funciones. Y entre más funciones anidadas así, más cosas se van a agregar a la pila de llamadas. Y vamos a construir sobre esa pila de llamadas. Porque hasta que una función regrese, hasta que se complete, no se puede quitar de la pila de llamadas. Ahora con toda esta ilustración, dejé SetTimeout por ahí y dije que el motor JavaScript simplemente se olvidó de ello. Bueno, vamos a hablar eso cuando lleguemos al tema en el bucle de eventos, porque realmente es el bucle de eventos y la cola de mensajes los que tratan con eso, los que tratan con estos elementos de la API web. Entonces lo discutiremos en otro tema. Pero antes de pasar al siguiente tema, quiero abordar algo que podamos encontrar con la pila de llamadas se llama Stack Overflow. Y esta es una condición con la que quizás te hayas topado con tu codificación. Esto ocurre cuando la pila de llamadas se llena porque no puede eliminar comandos y se siguen agregando más a ella. Mencioné que las funciones anidadas podrían agregar mucho a la pila de llamadas. Bueno, se necesita bastante para la pila de llamadas se llene. Pero cuando sí se llena, provoca un error. Ahora, podemos simular esto con bastante facilidad con una llamada recursiva. Ahora, la recursión es simplemente cuando una función se llama a sí misma. Y hay algunas situaciones en las que este es un patrón ventajoso en JavaScript. Pero quiero mostrarte los efectos de lo que hace en la pila. Entonces, sigamos adelante y configuremos una función que lo ilustrará. Este archivo JavaScript se adjunta al archivo HTML. Este de aquí que estamos viendo anteriormente. Sólo voy a ponerle una función y llamarlo auto ramus. ver qué pasa. Entonces déjame llamarlo recursión. No es necesario llamarlo así, pero voy a hacer eso porque voy a estar llamándolo. Y entonces voy a establecer el número que se pasa igual a sí mismo más a sí mismo, algo sencillo así. Y entonces aquí es donde ocurre la recursión. Nos invocamos desde adentro. Entonces piensa en lo que va a hacer esto. La pila de llamadas. Vamos a llamar a recursión va a colocar la recursión en la pila de llamadas se va a bajar a esta línea. Y se va a llamar de nuevo a la recursión, pero la función no se ha completado, por lo que no se elimina de la pila de llamadas. Otra invocación de eso se agrega a la pila de llamadas. Y así sigue agregando recursividad a la pila de llamadas hasta que se acumula hasta el punto de que ya no puede agregar. Y ahí es donde obtenemos ese desbordamiento de pila. Déjenme seguir adelante e invocar esto. Va a pasar en el número uno. Eso lo guardaremos. Ahora como acabo de tener eso adjunto a este archivo HTML, sólo voy a refrescar eso y ver qué pasa. Abramos la consola y veamos qué tenemos ahí. Tenemos un rango de aire sin captura. Nuestro tamaño máximo de pila de llamadas excedió. Este es el aire que recibiríamos. Si tuviéramos un desbordamiento de pila. superó el tamaño máximo de la pila de llamadas, y eso es lo que estamos consiguiendo allí. Ahora bien, este es un problema sencillo de resolver. Todo lo que tenemos que hacer es asegurarnos de que eventualmente las funciones comiencen a completarse, que regresen. Y luego puede eliminarlos de la pila de llamadas. Eventualmente eliminarlos todos de la pila de llamadas de calavera. Veamos cómo se podría hacer eso. Digamos que si el número es mayor que y sólo voy a poner aquí un número grande. No tengo idea de lo grande que va a ser, pero si es mayor que eso, entonces solo voy a iniciar sesión en la consola. Quiero ver qué tan grande es el número, solo por diversión. Y luego voy a regresar. Entonces aquí es donde estamos regresando de esta función. Entonces completará la función, volvemos aquí. No va a hacer esto otra vez. Y completará esa función en la que estamos. Y así entonces desenrollará la pila de llamadas, cada una de esas funciones. Finalmente llegaremos a regresar porque llegará al final de la función. Y así el hecho de que la última vez que llamamos a esto, donde el, donde num es mayor que esto, que obliga a un retorno, no llama a otro. Y así todos esos otros que están en la pila de llamadas llegan a completarse también. Y así entonces no obtenemos ese desbordamiento de pila. Muy bien, veamos eso solo una vez más. Voy a refrescarme aquí. Quiero recordar que no es cada vez más grande si no lo vuelvo a pasar cuando llamo a esa función. Así que quiero asegurarme de que se está haciendo más grande. Ahí vamos. Ahora nos un número muy grande sale un número muy grandey ya no estamos recibiendo el desbordamiento de pila porque fue capaz de regresar. Y luego desenrollar todas esas llamadas a funciones que están en la pila. Entonces a eso nos referimos cuando hablamos de StackOverflow. Muy bien, pasemos al siguiente tema. 5. Colección de basura: En el tema anterior, mencionamos la recolección de basura en relación con el montón de memoria. En un lenguaje como C, tenemos que asignar y liberar memoria. No vamos así en JavaScript, pero aún tiene que haber un mecanismo para recuperar memoria. Así que no nos quedamos sin memoria y fallamos el sistema. Javascript se encarga de recuperar la memoria por nosotros. Una vez que una pieza de información, un objeto o variable, está fuera de contexto y ya no se utilizará. Se recupera la memoria, por lo que se puede reutilizar. A esto se le llama recolección de basura. Echemos un vistazo a cómo funciona eso en el motor. recolección de basura se lleva a cabo en el montón de memoria y utiliza lo que a veces se llama algoritmo de marca y barrido. Determina los objetos que se pueden eliminar de manera segura del calor de la memoria determinando qué cosas son alcanzables y cuáles son inalcanzables. Y luego barre a través de aquellos que son inalcanzables. Están barridos y ese recuerdo es reclamado. Echemos un vistazo a cómo funciona. Ahora, el recolector de basura comienza con el objeto raíz o global y se mueve a los objetos referenciados por ellos. Y se mueve de un objeto a otro, identificando cosas a las que hace referencia otra cosa. Entonces, básicamente, esas cosas que son alcanzables, esas cosas que no son alcanzables ahora están definidas. Y entonces todo lo que es inalcanzable, ahora vemos algunas cosas que no están vinculadas o no alcanzables. Todo lo que es inalcanzable está despejado. Atraviesa y los barre. Se han ido. Esa memoria ahora puede ser recuperada y utilizada para otra cosa. Ahora bien, como notó en nuestra explicación, el orden para que la información sea liberada y recuperada no debe estar conectada a nada que esté sucediendo actualmente en el programa inalcanzable. Si bien es posible nuestra codificación evite que las cosas se recuperen, aunque ya no las estemos usando. Esto se llama fuga de memoria. Las fugas de memoria son partes de la memoria que la aplicación necesitaba y usó en el pasado y ya no se necesita, pero su almacenamiento aún no se devuelve al grupo de memoria. A pesar de que la recolección de basura se maneja para nosotros. Como hemos visto, todavía necesitamos ser cautelosos con la administración de la memoria. Las fugas de memoria pueden hacer que los programas JavaScript fallen al usar toda la memoria disponible. Veamos algunas cosas comunes que pueden provocar fugas de memoria. Entonces, antes que nada, las variables globales. Si sigues creando variables globales, éstas se quedarán a lo largo de la ejecución del programa, aunque no sean necesarias. Si estas variables son objetos profundamente anidados, se puede desperdiciar mucha memoria. No eliminar los oyentes de eventos que ya no son necesarios. Como un ejemplo de cómo puede suceder esta cosa en particular. Podrías crear muchos oyentes de eventos para una página o ubicación en particular. Y luego cuando el usuario pasa de eso, donde esos oyentes de eventos son largos, ya no es necesario. Tú como programador, no los elimines. Siguen ahí. Todavía están tomando memoria, especialmente para los objetos a los que están vinculados. Entonces algo a tener en cuenta. El tercer ítem, intervalos de tiempo poco claros. Ahora bien, establecer intervalo es un buen ejemplo de esto. Y si no has usado set interval, básicamente lo que hace es que te permite ejecutar algún código y otra vez en base a una cantidad de tiempo establecida. Ahora, veamos un ejemplo realmente rápido de éste. Sólo voy a llamar a establecer intervalo. Y establecer intervalo toma como primer parámetro una función. Esta es una función de devolución de llamada. Así que cada vez que expira el intervalo, la cantidad de tiempo que ingresamos invoca esta función de devolución de llamada. Entonces voy a configurar una función aquí. Y entonces el segundo parámetro es la cantidad de tiempo en milisegundos que ocurre cada intervalo. Entonces, cada 200 milisegundos, esta función va a ser invocada, ¿de acuerdo? Ahora, donde esto puede convertirse en un problema, digamos dentro de aquí, hacemos referencia al número de objetos. Esos objetos son, están siendo referenciados ahí. A veces es algo que se hace con animación o algo así. Pero si esto nunca se borra, si no se borra este intervalo establecido, obviamente estas referencias seguirán siendo válidas. Y así nunca podrá liberar esa memoria aunque ya no esté siendo utilizada. Entonces un mejor acercamiento al problema del intervalo establecido es declarar un ID y lo configuramos igual a setInterval que colocará un ID dentro de aquí. Entonces, cuando hayamos terminado, debemos asegurarnos de que tenemos intervalo claro con ese ID, algo así. Bien, una cosa más tenemos que mencionar, y eso se eliminan los elementos DOM. Si en tu programa eliminas elementos del DOM. Pero estos elementos siguen siendo referencia, como con un oyente de eventos. Hablamos de eso antes, o de alguna otra manera, no se va a liberar la memoria. Algo más a tener en cuenta. Ahora, volveremos a visitar algunos de estos y otros lugares del curso para que tengas un recordatorio de las mejores prácticas para evitar fugas de memoria. Todas estas cosas de las que hemos hablado pueden sumar y las fugas de memoria seguirán tomando cada vez más memoria. Si su programa se ejecuta el tiempo suficiente, eventualmente podría fallar por falta de memoria. Aunque no se caiga, debes asegurarte de evitar fugas de memoria y no solo depender de la recolección de basura para salvar el día. Bien, pasemos al siguiente tema. 6. Cómo eliminar los escuadrones de eventos: En este segundo tema sobre recolección de basura, quiero ampliar algunas de las técnicas que son específicas de los navegadores mencionados en el tema anterior. En concreto, voy a abordar cómo eliminar los oyentes de eventos y JavaScript. No todos los desarrolladores de JavaScript están familiarizados con esta característica, pero es fundamental cuando se habla de recolección de basura. Así que quería insertarlo aquí. Ahora, si estás codificando para el navegador, entonces estarás trabajando con el amanecer. El DOM es la abreviatura de Document Object Model. Se trata simplemente de una interfaz que permite a JavaScript manipular el contenido, estructura y el estilo del documento HTML. El documento HTML se representa utilizando nodos y objetos para que el programador pueda interactuar y trabajar con cada elemento de la página HTML. Existen numerosos comandos para trabajar con el DOM. Cubro estos en detalle en mi curso Getting Started y he incluido algunos de estos temas en el apéndice. Si necesitas revisar. He incluido información sobre el DOM y comandos para seleccionar y trabajar con elementos DOM. Bien, ahora volvamos al tema que nos ocupa. Si ha adjuntado un listener de eventos a un objeto o a un elemento DOM, y ese evento ya no se utilizará. Es una buena práctica eliminar al oyente. Entonces echemos un vistazo al ejemplo. Echemos un vistazo al código HTML de esta página, que estoy mostrando actualmente. Aquí está, como pueden ver, es una página HTML bastante simple. Tenemos un título en el encabezado, tenemos algunos CSS. Entonces en el cuerpo aquí tenemos algunas etiquetas div. Y lo que quiero hacer es adjuntar un oyente de eventos a esta etiqueta div aquí que tenga un ID de título. Entonces, si echamos un vistazo a nuestro código JavaScript, como puedes ver, este app.js se adjunta a este archivo HTML. Aquí hemos declarado algunas variables. Ahora, solo estoy haciendo esto de manera simplista para mostrar un ejemplo aquí. Así que he usado algunas variables globales porque es muy sencillo. Yo no, no me estoy tomando el tiempo para hacerlo de otra manera. Sólo quiero mostrar este ejemplo. Entonces tenemos algunas variables globales aquí. Una es cuenta y otra es una variable de título que almacena ese div que tiene un ID de título. Así es como lo selecciono ahí. Entonces vamos a agregar un oyente de eventos a eso. Entonces vengo aquí y simplemente tomo esa variable ahí, agrego oyente de eventos. Y tenemos que indicar qué evento es. Es un evento click como uno que queremos usar. Y ahora, ¿a qué función se le va a llamar Eso es título? Haga clic en esta función aquí. Ahora a veces puedes agregar oyentes de eventos con funciones anónimas, donde declaras la función aquí mismo, en lugar de declararla antes de declararla dentro del listener de eventos add. Y eso está bien. Pero debes tener en cuenta que si haces eso, no puedes eliminar el oyente de eventos es un caso en el que es posible que necesites eliminarlo, entonces deberías hacerlo de esta manera. Bien. Hablaré del motivo de eso en tan solo un minuto cuando lleguemos a ese punto. Pero primero, asegurémonos de que esto esté funcionando. Voya salvar eso. Ya tengo el servidor virtual ejecutándose en esa página. Así que sólo voy a cambiar el tamaño de esto. Y vamos a mostrar la consola para que podamos ver el mensaje de registro de la consola cuando haga clic en el título. Y como podemos ver que aparece y el contador va incrementando y contando tantas veces se le ha hecho clic. Bien, así que bastante simple. Hemos agregado el EventListener ahí. Ahora veamos cómo eliminaríamos ese oyente de eventos. Entonces digamos aquí arriba, queríamos quitarlo una vez que el conteo fuera mayor a cinco. Así que vamos a hacerlo rápido. Si declaración. Si el conteo es mayor a cinco. Bueno esa es una situación en la que vamos a eliminar al oyente de eventos. Yaquí está el comando. Tenemos que usar el mismo objeto al que está unido el oyente de eventos. En este caso, es un elemento DOM. Entonces mareas punto y luego el comando es remove event, listener, así. Ahora esta parte dentro de los paréntesis aquí tiene que coincidir con lo que teníamos aquí abajo cuando configuramos el EventListener. Y por eso digo que cuando usarías la función anónima, no puedes conseguir que eso funcione. Es necesario declarar la función de antemano. Entonces estas cosas son lo mismo. E incluso si declaras opciones o usas captura, cualquier otra cosa, cuando configuras el AddEventListener, necesitas incluirlos aquí necesitas incluirlos aquítambién para eliminarlos. Ese es uno de los requisitos de este comando remove event listener. Bien, así que sigamos adelante y guardemos eso. Eso refrescará la página. Se puede ver que esos mensajes desaparecieron. Ahora si empezamos a darle clic, cuenta, cuenta, conseguiremos seis. Ahora debería ser removido. Ahora le estoy dando click y no pasa nada. Ese oyente de eventos fue eliminado. Entonces ese es básicamente el proceso de eliminar un oyente de eventos. Queríamos cubrirlo aquí porque estábamos hablando de recolección de basura. Bien, sigamos adelante. 7. Lazo de eventos: Ahora antes de terminar hablar del motor JavaScript, necesitamos hablar del bucle de eventos. Hasta este punto, hemos establecido que JavaScript es de un solo hilo. Sólo tiene una pila de llamadas. Sólo puede hacer una cosa a la vez, por lo que es sincrónico. Sin embargo, JavaScript nos permite hacer codificación asíncrona. Un ejemplo sencillo de eso es agregar un botón a una página HTML. Podemos estar ejecutando algo de JavaScript. El usuario hará clic en el botón y nosotros podremos responder a ese clic. Porque tenemos JavaScript ejecutándose haciendo otra cosa. No impide que el usuario haga clic en ese botón. Eso por supuesto, sería una experiencia horrible en un navegador. Otro ejemplo es si estamos tratando obtener algunos datos de una base de datos, hacemos esa llamada a la base de datos y luego podemos hacer otra cosa mientras estamos esperando que los datos regresen. No tenemos que sentarnos a esperar esos datos antes de hacer otra cosa. Y eso bloquearía otro procesamiento de JavaScript. Podemos hacer otra cosa. Y entonces cuando los datos regresen, podemos actuar sobre esos datos. Podemos lograr esta codificación asíncrona en JavaScript debido al bucle de eventos. En el escenario anterior, el comando setTimeout fue manejado por la API web. Y lo mencioné En ese punto, el motor JavaScript se olvida por completo de ello. Bueno, una vez que se realiza ese evento de timing, una vez que la API web termina en el evento timing, ¿cómo se vuelve a integrar eso en la pila de llamadas para que se haga la tarea que queremos completar? Por ejemplo, si recuerdas, tenemos una función de devolución de llamada como parte del setTimeout. ¿ Cómo devuelve esa función de devolución de llamada al motor JavaScript? Repasemos de nuevo ese escenario anterior, pero esta vez incluiremos el bucle de eventos. Una vez más. Aquí está nuestro código, aquí está nuestro setTimeout. Y fíjate que tenemos una función aquí. Toda la función tiene dentro de ella como una instrucción de registro de consola, eso es todo. Los milisegundos se establecen en 0, por lo que el temporizador debe caducar inmediatamente. Pero veamos qué pasa. Hemos llegado al punto en que se invoca la función hello-world. Entonces sigamos caminando por eso. Entonces tenemos la invocación de la función hello-world que se agrega a la pila de llamadas. Y entonces comienza a trabajar a través los comandos dentro de esa función. Y así el primer comando que encontramos es una instrucción de registro de consola y va a registrar la variable a a la consola. Y así eso se agrega a la pila de llamadas. Se encarga de esa declaración de registro. Vemos hola en la consola. Y luego se elimina el comando console log de la pila de llamadas. Y luego nos movemos en esa función, nos encontramos con el setTimeout. Ahora, el motor JavaScript sabe que setTimeout es manejado por la API web, lo que se envía allí para ser tratado. Entonces la API web configura un temporizador. Tiene la capacidad de ejecutar un temporizador. Y ese temporizador expira inmediatamente porque no hemos ajustado a 0 milisegundos. Y así cuando expira el temporizador, ¿qué hace con esa función de devolución de llamada? Eso es lo que se supone que debe hacer ese temporizador. Y entonces lo que hace es agregar la función de devolución de llamada a la cola de mensajes. Ahora esa función de devolución de llamada se sentará en la cola de mensajes y es en este punto el bucle de eventos entra en juego. El ciclo de eventos continuará circulando. Estará revisando la pila de llamadas y verá si está vacía. Ahora mismo. trabajando en la función hello-world. Entonces no está vacío, sino en ciclos y sigue buscando escena. Si está vacío. Si está vacío, entonces agregaría el siguiente elemento disponible en la cola de mensajes en la pila de llamadas. Pero ahora mismo no está vacío, así que necesitamos continuar con la función hello-mundo. ¿ Qué es lo siguiente que surge? Bueno, es otra instrucción de registro de consola, así que eso se agrega a la pila de llamadas. Y seguimos adelante y completamos esa declaración de registro de consola World se imprime en la consola. Y para que esa sentencia de registro de consola se elimine de la pila de llamadas. En este punto hemos terminado con la función hello-world que también se elimina de la pila de llamadas. Entonces como mencioné, el bucle de eventos está ciclando y comprobando la pila de llamadas. Entonces en cheques y lo ve, está vacío. Luego toma el siguiente elemento en la cola de mensajes y lo agrega a la pila de llamadas. Y así sacamos esa función anónima, esa función de devolución de llamada, fuera de la pila de llamadas y comienza a trabajar a través de lo que esa función necesita hacer. Lo único que contiene es una instrucción de registro de consola. Encuentra esa sentencia de registro de consola y la agrega a la pila de llamadas. completa la instrucción de registro de la consola. imprime un signo de exclamación la consola que se elimina de la pila de llamadas. Ese es el final de esa función, y esa función también se elimina de la pila de llamadas. Y así en este punto en la pila de llamadas está vacía, no queda nada que agregar desde la cola de mensajes. Y así simplemente estamos esperando un número, otro comando de JavaScript que necesita ser ejecutado. Bien, ahora antes de que terminemos, permítanme destacar algunos puntos importantes de esta discusión. Primero, otras partes del entorno JavaScript pueden manejar ciertas tareas. Por ejemplo, aquellas tareas que pertenecen al navegador. El motor JavaScript no tiene que procesarlos. Nosotros, en este ejemplo usamos la API web para manejar ese comando setTimeout. Pero las devoluciones de llamada que forman parte de lo que se maneja allí se integran de nuevo en el motor usando el bucle de eventos. extrae de la cola de mensajes y los agrega a la pila de llamadas. Logramos JavaScript asincrónico de esta manera. El bucle de eventos es crítico para que eso suceda. Otro punto importante, una vez que se agrega una devolución de llamada a la pila de llamadas, el código es manejado por la pila de llamadas como lo sería normalmente si el código JavaScript no hubiera venido de la Q, no no importa. Se va a procesar ese JavaScript de la misma manera. A continuación, un recordatorio, el bucle de eventos está constantemente buscando elementos en la cola. Y si la pila de llamadas está vacía, si la pila de llamadas está vacía y hay algo en la cola, agregará el siguiente elemento disponible de la cola a la pila de llamadas. Y como se mencionó, la pila de llamadas es de un hilo, por lo que es sincrónica. Solo puede hacer una cosa a la vez, pero su interacción con el bucle de eventos y la API web permite la codificación asíncrona que podemos lograr en JavaScript. Muy bien, pasemos al siguiente tema. 8. Entorno de tiempo de ejecución: Dado que NodeJS es una implementación tan ampliamente utilizada de JavaScript, creo que es importante mirar brevemente su entorno de tiempo de ejecución, especialmente en relación con el bucle de eventos y cola de mensajes que de lo que acabamos de hablar. Este artículo aquí cubre algunos de los entresijos del entorno Node.JS. Y aquí está la URL de este artículo. Puedes leerlo tú mismo si quieres. Pero quería tomarme un momento y mirar el diagrama que proporciona del entorno de tiempo de ejecución. Entonces si nos desplazamos un poco hacia abajo aquí, aquí mismo, el nodo JS Runtime. Ahora bien, algunas de estas cosas las vas a reconocer, por ejemplo, V8, aquí está el motor V8 y está manejando el JavaScript. Eso es lo que hace. Observela cola de eventos, nombre diferente pero similar a la cola de mensajes. El bucle de eventos también es parte de esto. Con el fin de manejar las cosas en la cola de eventos. Esta parte aquí en vivo, podría pensarse como similar a la API web va a manejar cosas que NodeJS necesita hacer. Eso no lo hace JavaScript, lo hace el entorno fuera de él. Por lo que el motor V8 sigue siendo de un solo hilo, todavía tiene una pila de llamadas, pero puede aprovechar otras cosas. Y ejecutándose en un servidor, hay una serie de cosas diferentes que hacer y eso va a ser manejado aquí. Ahora sabemos que GIS sí tiene algunos comandos que son similares a lo que vemos en el navegador. Por ejemplo, setTimeout, set interval, ambos están disponibles y NodeJS también, no son manejados por el motor V8, igual que no están en un navegador. Están manejados por aquí. Y así hay algunas similitudes. Pero porque es un entorno diferente, porque el tiempo de ejecución es diferente. Se manejó de diferentes maneras, pero los conceptos son transferibles. Entonces, una vez más, puedes leer más sobre esto en este artículo si así lo eliges. Pero sí quería hacer el punto del bucle de eventos y las similitudes entre NodeJS y el entorno de tiempo de ejecución manejado en un navegador. Bien, pasemos al siguiente tema. 9. Iniciación de ejercicios: pila de llamadas y lazo: Así que quería hacer un pequeño ejercicio divertido como parte de esta sección, una oportunidad para explorar un poco la pila de llamadas y el bucle de eventos. Ahora, con todos mis cursos, siempre tengo ejercicios lo largo de ellos porque creo que es importante a lo largo de ellos porque creo que es importante que realmente hagas cosas para aprender que hacer las cosas tiene que ser por tu cuenta en tiempos. Y así es donde entran los ejercicios. La forma en que los hago es que tengo un video inicial presentando el ejercicio. Y luego sigues adelante y pruébalo. Y luego cuando estés listo, vas al siguiente tema. Y nosotros pasamos por ese ejercicio. Esa es generalmente la estructura. A veces hacen las cosas un poco diferentes, pero esa es generalmente la estructura. Entonces, sigamos adelante y echemos un vistazo a lo que me gustaría que hicieras para este ejercicio. Muy bien, los archivos para el ejercicio, y específicamente el archivo JavaScript App.js. Tengo un código aquí y déjame explicarlo muy rápido y luego te indicaré lo que me gustaría que hicieras. Así que aquí estamos creando una matriz, y estamos creando una matriz con 10 mil elementos. El número que he usado en el constructor, el constructor de matriz ahí mismo. Y luego usamos el método fill de arrays para rellenar eso con unos. Y así básicamente crea un array con una longitud de 10 mil que tiene unos en todos ellos. Eso es lo que estamos haciendo aquí. Entonces tengo un poco de función, lo llamo pop it. Básicamente todo lo que hace es simplemente sacar un valor cada vez que se llama a la función desde esta matriz aquí. Y luego lo invocamos. Y note que tenemos recursión aquí porque comprueba la longitud de la matriz. Si la longitud es aún mayor que 0, lo que significa que todavía hay elementos en esa matriz, entonces se llamará a sí mismo de nuevo, lo que hará que salga de otro elemento. Eso es recursión que estamos haciendo. Y como recuerdas cuando hicimos recursión antes, somos capaces de desbordar la pila. Y entonces lo que me gustaría que hicieras es ver qué número se requiere para provocar un desbordamiento de pila. Si 10 mil te funcionan , entonces genial. Pero puede que no. Y así solo juega con esa cantidad de pujas, un poco divertido solo para ver qué va a hacer que eso se desborde. Y luego la segunda parte del ejercicio, una vez que te desborde esa pila, ¿cómo puedes cambiar esto? ¿ Cómo puede hacer que esto use el bucle de eventos para que la pila no se desborde? Así que una idea interesante, aprovechando algo que está disponible en el entorno de tiempo de ejecución para que no desbordemos la pila, pero aún así podemos usar ese mismo número que estaba desbordando la pila. Así que dale, pruébalo. Obviamente, no te he enseñado comandos específicos para que hagas esto, aunque has visto algunos ejemplos ya que hemos estado revisando diferentes conceptos en esta sección. Pero pruébalo con lo que sabes. Y luego, cuando estés listo, pasa al siguiente tema y nosotros lo repasaremos. 10. Fin de ejercicio: pila de llamada y lazo: Bien, echemos un vistazo a este pequeño ejercicio divertido de aquí. Entonces ahora mismo, 10 mil, así es como hay en esta matriz. Veamos si esto provoca un StackOverflow. Así que voy a seguir adelante y servir esto y ver qué obtenemos. Entonces voy a saltar al archivo HTML y luego hacer clic en Go Live. Y luego saltó a la consola. este momento no estamos viendo ningún error para StackOverflow. Entonces eso parece estar funcionando bien. Así que saltando de nuevo a Visual Studio Code, solo voy a reducir un poco el tamaño de esto para que podamos seguir adelante y ver el registro de la consola mientras jugamos con esto. Entonces vamos hasta, vamos a ir 10 mil 500. Veamos qué pasa ahí. Entonces voy a cambiar ese número ahí, guardarlo aún. Bien. Vamos a ir a 11 mil. Voy a salvarlo. Y todavía no tengo ningún problema. Entonces tal vez necesitamos saltar más. Vamos 13 mil todavía. Bien, vamos 15 mil. Y ahí nos sale un desbordamiento. Entonces no sé cuál es el número exacto, pero eso no era realmente lo que quiero lograr aquí. Yo solo quería darte la oportunidad de jugar con este desbordamiento de pila y ver que eventualmente en algún momento, provocará que se supere el tamaño de la pila. Entonces tenemos aquí el rango de aire sin atrapar. Bien, entonces ahí está el aire que estamos buscando. Ahora. ¿Cómo podemos cambiar esto? Así que todavía podemos mantener este número y aún así poder ejecutar este recursivamente y sacar todos estos elementos de la matriz. Bueno, para aprovechar el bucle de eventos, podemos usar la API web, podemos usar setTimeout para realmente invocar esta función nuevamente. ¿ Bien? Entonces, en lugar de llamarlo recursivo, recursivamente de inmediato, podemos usar setTimeout para invocarlo. Y así la forma en que lo haríamos, setTimeout, y luego pasamos en la función. Ahora no incluimos los paréntesis en este punto porque eso hará que se invoque enseguida. Simplemente pasamos en la función y luego la invocará una vez que el temporizador haya caducado. Entonces vamos a poner un 0 después de eso por 0 milisegundos que queremos invocar enseguida. Y así que aquí está nuestra nueva configuración. Sigamos adelante y guardemos eso y veamos qué pasa aquí abajo. Fíjate que no estamos recibiendo el aire. Sigamos adelante y echemos un vistazo a la matriz, veamos cuántos quedan. Bajamos a 13.600. Entonces así es como muchos han reventado. Entonces, obviamente, ya que estamos usando el bucle de eventos, estamos usando la API web con setTimeout. Con el fin de reventar estos. Está tardando más en eliminarlos todos porque tiene que configurar ese temporizador. Entonces pone algo en cola. Y entonces ese elemento de la cola se coloca entonces en la pila de llamadas y luego se saca. Y está haciendo eso una y otra vez. Así que vamos a verlo en su contra y lo hemos reducido a oh, ya bajamos 67 mil o 6700. Entonces se está moviendo a través de ellos, pero es un poco ordenado. Se puede ver que hace esto porque lo está haciendo mucho más lento. Pero fíjate que no está bloqueando. Puedo introducir cosas aquí en la consola y no estoy bloqueado de hacer otras cosas en JavaScript. Entonces esa es la ventaja de el bucle de eventos funcione para nosotros ahí. Echa un vistazo más, casi listo. Y para cuando presiono Retorno, ya estaba hecho. Así que ahora se ha limpiado de esa matriz. Así que solo un pequeño ejercicio divertido para explorar la pila de llamadas, un bucle de eventos un poco. Bien, pasemos al siguiente tema. 11. Cómo evoluciona JavaScript: Como desarrollador de JavaScript, es importante entender cómo evoluciona y cambia JavaScript. Porque eso es algo que es definitivo en el mundo JavaScript. Está en constante evolución. Cuando empecé a usar JavaScript hace muchos años, no se parecía en nada al lenguaje que tenemos hoy en día. Casi se siente como un idioma completamente diferente. Ahora podemos hacer mucho más con él. Para entender cómo evoluciona JavaScript, necesitamos hablar de dos cosas, ekman script y TC 39. Primero, hablemos del guión ECMO. Ahora. ¿ Qué es un guión? Seguro que ya has oído hablar de ello. Está maltratado todo el tiempo, básicamente como simplemente una especificación utilizada por ciertos idiomas. Está estandarizado por ACM International, y de ahí viene el nombre. Javascript es la implementación más utilizada de nuevo mi script. Entonces es por eso que está enredado con JavaScript tan de cerca. Pero hay otros idiomas de los que probablemente hayas oído hablar. La caída de este estándar de guiones de Ekman. Por ejemplo, Action Script, que es el lenguaje detrás del flash que se basa en el estándar de script Ekman y el script J que fue realizado por Microsoft. Eso también se basa en esa especificación. Ahora, la primera edición del estándar de guiones Ekman surgió en junio de 1997, y a eso se le llamó Ekman script one o ES1. Y desde ese momento, cada lanzamiento adicional ha sido ese número se ha incrementado. Entonces ES x1, x2, x3, y así sucesivamente. Ahora, cuando se estrenó acme script sexto, comenzaron a designar el contrato de arrendamiento con el año. Y así en ese momento, el lanzamiento fue técnicamente referido como Ackman guión 2015 porque ese es el año que Ekman guiones seis fue lanzado. Sin embargo, ES6 acaba de quedarse atascado. Y así la gente se refiere a eso como ES6 o ECMO guión 2015. Van de un lado a otro entre eso, porque los lanzamientos de ES6 se atascaron. Ese lanzamiento en particular fue un lanzamiento enorme con una serie de características para JavaScript. Si estabas en el mundo JavaScript en ese momento, recordarás cuántas cosas se agregaron a JavaScript. ese lanzamiento en particular se agregaron muchas cosas que ahora hacen un uso regular Duranteese lanzamiento en particular se agregaron muchas cosas que ahora hacen un uso regularde ellas. Ahora, desde que salió esa versión del estándar, ha habido un nuevo lanzamiento cada año. Y así hemos tenido guión de Ekman, 2016201718192020. Cada año, ha salido un nuevo lanzamiento. Mucho de eso viene del hecho de que el lanzamiento de los guiones de Ekman seis fue tan enorme. No querían otra versión tan grande otra vez. Y así se acercan al lanzamiento es de una manera mucho más manejable. Ahora bien, ¿quién determina qué hay en cada lanzamiento? ¿ De dónde viene todo eso? Bueno, eso tiene que ver con TC3 nueve. Entonces hablemos de eso. Ahora. Tc 39 significa comité técnico 39. Y son un comité que evoluciona JavaScript. Y sus miembros son empresas como los vendedores de navegadores, ese tipo de cosas tienen un interés personal en JavaScript. El comité se reúne regularmente y puedes seguir sus actas en línea si así lo deseas. Entonces en ese sentido, es transparente. Ahora para que una característica llegue a la madurez y se convierta en parte de una futura versión estándar de Ekman script, esa característica debe pasar por varias etapas y las llamamos etapas de madurez. Por lo que TC3 dynein, el comité, maneja estas propuestas a través estas etapas hasta que son aceptadas como parte de la norma. Entonces quiero hablar de esas etapas muy rápido. Entonces etapa uno o etapa 0, la primera etapa. Pero la etapa 0 es en realidad etapa de sumisión. Y esto es solo una presentación de una nueva característica, una propuesta para una nueva característica. Y esto debe provenir de un miembro de TC 39 o alguien que sea considerado un colaborador de TC 39. Y básicamente se trata de un documento que describe cuál es la característica que quieren. Esa etapa 0. La primera etapa es la etapa de propuesta. Ahora esta es una propuesta formal para el largometraje. Y esto debe tener un campeón que como parte de ese comité, alguien que quiera que este rasgo sea adoptado. Entonces esa es la etapa uno. La segunda etapa es la etapa de borrador. Y esta es realmente la primera versión de lo que estará en la especificación para esa característica en particular. Una vez que algo se pone en escena a su eventual inclusión es mucho más probable. Ahora la etapa tres es la etapa candidata. En este punto, la propuesta está mayormente terminada y necesita retroalimentación de implementaciones y de usuarios. Y luego finalmente, la etapa cuatro es la etapa terminada. En este punto, está listo para ser incluido en la especificación y lo más probable es que se incluya en la siguiente especificación próxima. Pero eso no es necesariamente una garantía. A través de todas estas etapas, estas características siguen siendo consideradas propuestas y no son características hasta que se incluyen oficialmente en la norma. Ahora bien, conocer estas etapas puede ser importante. Por ejemplo, si vas a un sitio como este, y accedes a las próximas funciones, lo cual se hace con este siguiente botón para averiguar qué es lo que está apoyando y qué no es compatible. Observe cómo se rompe en las etapas de las que acabamos de hablar. Aquí está la etapa de candidatos, esto es lo que se avecina como posibilidad en el próximo lanzamiento del guión de Ekman. Y se puede ver que algunos navegadores y algunos compiladores ya están empezando a soportar estas características propuestas. Se puede ver que por aquí, medida que avanza por las etapas borrador dos, se ve que cada vez se han hecho menos implementaciones . Y así como estos vendedores tienen un escaño en el comité, saben lo que viene. Pueden ser los campeones de una propuesta en particular, quién sabe, pero empiezan a implementar algunas de estas cosas antes de que pasen a formar parte de la especificación oficial. Se puede ver que incluso podemos ir despejados a la etapa 0, no pasa mucho ahí en absoluto. Entonces, cuando artículos o sitios como este están hablando de propuestas, propuestas de guiones de Ekman, están hablando de cosas que están en una de estas etapas que no han sido adoptadas oficialmente en el estándar todavía, pero se están moviendo en esa dirección. Entonces ese es el proceso que sigue tc treonina con el fin de actualizar el estándar de script Ackman para JavaScript. Bien, pasemos al siguiente tema.