Apuntes
Introducción
¿Qué significa ser un profesional de JavaScript?
Aspectos que destacan a un profesional
Inicio del proyecto
Repaso de Conceptos Fundamentales
Cómo llega un script al navegador
Scope
Closures
El primer plugin
this
Los métodos call, apply y bind
Prototype
Herencia Prototipal
Cómo funciona JavaScript
Parsers y el Abstract Syntax Tree
Abstract Syntax Tree en Práctica
Cómo funciona el JavaScript Engine
Event Loop
Fundamentos Intermedios
Promesas
Getters y setters
Fundamentos Avanzados
Proxy
Generators
APIs del DOM
Fetch - Cómo cancelar peticiones
IntersectionObserver
VisibilityChange
Service Workers
TypeScript
Introducción
Tipos básicos
Funciones
Interfaces
Clases
Convertir el proyecto a TypeScript
Patrones de Diseño
Qué es un patrón de diseño
Categorías de patrones de diseño
Patrón Singleton y Casos de Uso
Implementación del patrón Singleton
¿Cómo funciona el Patrón Observer?
Implementación del patrón Observer
Casos de Uso del patrón Observer: Redux
Patrón Decorator y Casos de Uso
Implementación del patrón Decorator
Proyecto: MediaPlayer
Implementación de plugin de Ads: Desplegando en consola
Implementación de plugin de Ads: Desplegando en pantalla
Publicar en npm
Conclusiones
Conclusiones
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
El JS Engine recibe el código fuente y lo procesa de la siguiente manera:
Un SyntaxError es lanzado cuando el motor JavaScript encuentra partes que no forman parte de la sintaxis del lenguaje y esto lo logra gracias a que se tiene un AST generado por el parser.
El parser es del 15% al 20% del proceso de ejecución por lo que hay que usar parser del código justo en el momento que lo necesitamos y no antes de saber si se va a usar o no.
Aportes 87
Preguntas 10
Apuntes
apuntes de la clase:
Para que el código llegue al navegador tiene que pasar muchas cosas, agarra el código, lo analiza, lo descontruye, lo construye nuevamente, lo ejecuta y lo optimiza. Vamos a hablar de todo esto.
Ha cambiado mucho, cuando empezó a leer JavaScript lo hacía con Netscape
que hacía cosas muy simples, se leía línea por línea, un paso a la vez. Hoy es igual, pero ahora de una forma diferente, ahora Google lo ha cambiado, ellos necesitaban a un navegador que ejecutara todo eficientemente. Por eso reinventó el funcionamiento del motor de JavaScipt
. En resumen esto es lo que hace:
Este es el proceso que realiza JavaScript para lograr ejecutar su código de la mejor forma posible. Ahora veamos un gráfico donde se explica mejor.
Bytecode: es un código de más bajo nivel que permite que se ejecute mucho más rápido.
Profiling data: encuentra todos los puntos optimizables del código para luego dar paso al optimizer compiler
Optimized code
Aveces este proceso falla y se quita la optimización.
Este agarra tu código fuente y lo lee, pero tiene que descomponerlo primero, a estos pedazos se les llama tokens, identifica que significa cada palabra o símbolo. Una vez teniendo esta información se pasa al Abstract Syntax Tree.
Cuando sucede un error en esta lectura es donde sucede el syntaxError
. No se puede leer tu código y no tiene sentido, los lenguajes de programación son muy formales, no se puede violar las reglas. Este proceso tiene que hacerse muy bien. Veamos que dice Google sobre este tema.
La mayoría del código no se ejecuta, por esto tenemos que empaquetar nuestro código de forma eficiente, a esto se le llama bunding y code splitting, separaremos el código y lo cargaremos cuando sea necesario solamente. Esto se ve mucho en la SPA.
Existen forma de hacer, concretamente dos, veamos cómo lo hace el V8.
Cuando se hace el Eager Parsing es donde se ve los errores y crea el AST, el árbol se lectura de nuestro programa, también se construye los scopes para leer las variables globales o privadas.
Cuando hacemos Lazy Parsing retrasamos alguna parte del código, logrando un x2 de rápido en la lectura, no se crea el AST y los scopes se construyen parcialmente.
Te compartiré un link donde puedes experimentar con los tokens para ver cómo funciona.
Allí veremos como nos arroja los tokens de una declaración.
> var answer = 6 * 7;
< [
{
"type": "Keyword",
"value": "var"
},
{
"type": "Identifier",
"value": "answer"
},
{
"type": "Punctuator",
"value": "="
},
{
"type": "Numeric",
"value": "6"
},
{
"type": "Punctuator",
"value": "*"
},
{
"type": "Numeric",
"value": "7"
},
{
"type": "Punctuator",
"value": ";"
}
]
Esto nos da el tipo y el valor que tiene cada palabra, símbolo o número. Tendremos cada uno de los caracteres clasificados para poder manipular y leer cada uno de ellos.
Esta es una estructura en forma de árbol, Abstract Syntax Tree. Este empieza desde una raíz y se desploma en partes.
Se puede usar en muchos lugares, para corregir el código, para compilar, entre otras funciones. Podemos experimentar en el siguiente enlace.
Allí veremos como se va ramificando nuestro programa y va haciéndolo en forma de patrón anidado profundo, aparece valores que nuestro programa terminará ejecutando.
En verdad este curso me voló la cabeza !
Me van a faltar estrellas para puntuarlo
Ey chicos me tome el tiempo para traerles las mejores notas del curso, denle una checada porfavor a mis notas, y si son de su agrado dejenme un like en github. Saludos 😄
Notas o https://github.com/JasanHdz/javascript-professional/tree/master/notes
Alguien me puede explicar como es que nosotros hacemos para influir en Eager Parsing y Lazy Parsing por favor.
Nada como entender las cosas desde su raíz, te permite tomar decisiones conscientes al momento de desarrollar (en este caso) y no sentir que est’as haciendo magia.
Cuando se habla de** lenguajes de alto nivel**, esto quiere decir que son mas fáciles de interpretar por un humano y cuando se dice que son lenguajes de bajo nivel, quiere decir que son mas fáciles de interpretar por las maquinas
Wow… ¿En serio nos estamos metiendo detrás del lenguaje? Amo este curso xD
Los bundlers y el code-splitting se usa mucho en VueJS para mejorar la carga de las páginas y cargar solo los scripts que necesitamos, es genial porque podemos ver como en la pestaña Network se van cargando los pedazos de código a medida que los requerimos mediante interacciones en la app.
Si sabía que el código JavaScript se interpretaba hasta ser código máquina, pero no sabía exactamente cómo lo hacía, y por o que veo pasa por 4 etapas fundamentales: Código fuente -> Abstract Syntax Tree -> Código binario -> Código máquina (Optmizado), y es en el proceso del cóidigo fuente hacía el AST donde se hace la revisión de la sintaxis ^^
JS Engine:
Recibe el código fuente y lo analiza. Mira las palabras reservadas y genera tokens con los que arma el AST.
Para ver los tokens: https://esprima.org/
Si se encuentra con una parte del código que no forma parte de la sintaxis del lenguaje se lanza un SyntaxError.
Google dice que:
Eager parsing:
Lazy parsing:
Es un grafo que representa un programa.
Ejemplo: https://astexplorer.net/
Se usa en:
Ahora entiendo por que la ignorancia es la felicidad de muchos. Nunca imaginé que aprender JS provocaría el que pisara estos terrenos. Nunca llevé lenguajes formales y autómatas en la universidad. Soy licenciado en informática y sé programar.
Debemos de pensar en un parser como el traductor de codigo que pasa el codigo que nosotros escribimos a codigo que nuestra computadora pueda entender.
Fuente: Javascript Syntax Parser
Les comparto una tarea que hice en la universidad en la que profundizo acerca de lo que realiza un interprete y un compilador para ejecutar nuestro código.
diferencias entre intérprete y compilador y las fases de la compilación
Increíble clase, es la primera vez que veo ejemplificados todos estos conceptos y no solo fueron mencionados.
Magistral esta clase, me ha dado duro este curso , pero cada vez se aprende mas.
Tokenizing/Lexing: fragmentar una cadena de caracteres en trozos significativos (al lenguaje) llamados tokens(fichas). Por ejemplo, considere el programa: var a = 2;. Este programa probablemente se dividiría en los siguientes tokens: var, a, =, 2 y ;. El espacio en blanco puede o no persistir como un símbolo, dependiendo de si es significativo o no.
Nota: La diferencia entre el tokenizing y el lexing es sutil y académica, pero se centra en si estos token se identifican o no de una manera sin estado o con estado. En pocas palabras, si el token invocara reglas de análisis de estado para determinar si a debe ser considerado un token distinto o sólo una parte de otro token, eso sería lexing.
Análisis sintáctico: coge un flujo (matriz) de tokens y lo convierte en un árbol de elementos anidados, que representan colectivamente la estructura gramatical del programa. Este árbol se llama «AST» (Abstract Syntax Tree o Arbol abstracto sintáctico ).
El árbol para var a = 2; puede comenzar con un nodo de nivel superior llamado VariableDeclaration, con un nodo hijo llamado Identifier (cuyo valor es a) y otro hijo llamado AssignementExpresión que tiene un hijo llamado NumericLiteral(cuyo valor es 2).
Generación de código: el proceso de tomar un AST y convertirlo en código ejecutable, esta parte varía enormemente dependiendo del idioma, la plataforma a la que se dirija, etc.
Por lo tanto, en lugar de entrar en detalles, simplemente nos limitaremos a decir que hay una manera de tomar nuestro AST descrito anteriormente para var a = 2; y convertirlo en un conjunto de instrucciones de máquina para crear una variable llamada realmente a(incluyendo la reserva de memoria, etc.), y luego almacenar un valor en un a.
Nota: Los detalles de cómo el motor maneja los recursos del sistema son más profundos de lo que vamos a indagar, así que daremos por sentado que el motor es capaz de crear y almacenar variables según sea necesario.
Dejo un post hecho por @lydiahallie que también explica muy bien y detalladamente cómo funciona el Motor de JavaScript.
vine del curso de v8 y me después de terminar ese curso empezare con este, me gusto tu explicación
Javascript llego con Netscape. Pero a finales de la década del 2000, Google necesitaba poder mejorar Google Maps, así que decidieron mejorar el motor de JS.
¿Qué hace el motor de JS V8?
⚠ Un SyntaxError es lanzado cuando el motor de JS se encuentra con partes de código que no forman parte de la sintaxis del lenguaje al momento de analizar el código.
Abstract Syntax Tree (AST):
Es un grafo (estructura de datos) que representa un programa. Se usa en:
 y en la construcción del árbol. Los “tokens” HTML incluyen etiquetas de inicio y final, así como nombres de atributos y valores. Si el documento está bien formado, el análisis sintáctico es más sencillo y rápido. El “parser” analiza la entrada simbólica en el documento, construyendo el árbol del documento.
Cuando el analizador de HTML encuentra recursos que no bloquean, como una imagen, el navegador solicitará esos recursos y continuará analizando. El análisis puede continuar cuando se encuentra un archivo CSS, pero las etiquetas <script> —particularmente aquellas sin un atributo async o defer— bloquean el renderizado, y pausa el análisis de HTML.
Cuando el navegador encuentra estilos CSS, analiza el texto en el Modelo de Objetos CSS (o CSSOM), una estructura de datos que luego utiliza para diseñar la distribución y el pintado. El navegador crea entonces un árbol de “renderizado” (dibujado) a partir de ambas estructuras para poder pintar el contenido en la pantalla. También se descarga el JavaScript, se analiza y luego se ejecuta.
El análisis de JavaScript se hace durante compile time o cuando se invoca el parser, como durante una llamada a un método
Me encontré con este magnifico post que pone en contexto sobre el Bundling y code splitting
https://www.simplethread.com/javascript-modules-and-code-bundling-explained/#:~:text=The compiler combines modules into,the downsides of the past.
al usar el operador de suma tambien puede ser un string, jajaja quien recuerda haber hecho una calculadora y al sumar 1 + “1” les daba 11 ajajajja
Esta clase es fantastica, Un excelente resumen a profundidad de una parte del curso de V8, Genial
Alguna pagina donde pueda practicar con ejercicios de js sencillos?
Excelente clase genial saber como se va armando todo el lenguaje
es bueno conocer a profundidad como funciona por dentro JS
tengo miedo :c
Genial, muy interesante.
Muy educativo
Empaquetar todo, por que no todo el codigo se ejecuta
Como funciona JavaScript
JS Engine => motores de JavaScript
Recibe el codigo, lo analiza , lo pasa a Abstract Syntax Tree(AST), un interpretador lo pasa a bytecode , que es lo que se ejecuta
y ahora pasara a machine code , que es el mismo codifgo pero mas optimizado.
Que es el parser?
Coge el codigo fuente y lo lee, antes de leer lo descompone en tokens , si al leerlo se detecta un error ,
que un error es cuando el motor de JavaScript, encuentra partes de codigo que no forman parte de la sintaxis, salta el SyntaxError.
Me estallo la cabeza con esta clase!
El modulo de este curso de como funciona JS es muy importante porque existen empresas muy especificas que te preguntan si sabes como el browser interpreta el JS, excelente curso
Perfecto con la explicación del comienzo de javascript, estas cosas se necesitan tarde o temprano
Parser de V8. Eager parsing y Lazy parsing.
Totalmente maravilloso, nunca había visto una explicación de esto
Como funciona el JS Engine
El motor de Js realiza lo siguiente:
Sé que se puede aprender sin pasar por la universidad, pero gracias a esta clase acabo de entender lo que no le entendí durante un semestre entero a mi profesor de compiladores
No lo habia pensado pero si tiene razon, la mayoria del codigo solo esta esperando a ser ejecutado y en cambio si tiene que ser compilado, ineficiente
Lo que hace el JS Engine es:
En pocas palabras lo analiza, deconstruye, va a construir, lo ejecuta y luego lo optimiza.
Lo primero que hace es descargar el script, se va a descargar en un flujo de bytes de UTF-16, y se va a pasar a un decodificador de bytes.
El decodificador de bytes va a crear tokens. Por ejemplo, 0066
lo decodifica a f
, 0075
a u
, 006e
a n
, 0063
a c
, 0074
a t
, 0069
a i
, 006f
a o
, 006e
a n
. Vemos que el parser nos da function
y es una keyword de JS, cuando el parser trabaja, nos separa si es un keyword
, identifier
(nombre de variable), punctuator
, string
, number
.
El motor de JS usa dos parser, el pre-parser y el parser. Para reducir el tiempo de carga, el navegador evita parsear el código que no es necesario en ese momento. El pre-parser maneja todo el código que se va a usar después y el parser maneja el código que se va a usar inmediatamente.
Cuando el parser esta analizando el programa y encuentra algo que no tiene sentido es cuando sale el error de syntax error. Un syntax error es lanzando cuando el motor de JS se encuentra con partes de código que no forman parte de la sintaxis del lenguaje al momento de analizar el código.
El proceso de parsing es importante que se haga bien porque el parsing es el 15-20% del proceso de ejecución, entre más grande el proyecto, más tarda el parsing. Algo malo es que la mayoría del JS no se termina ejecutando, esto hace que se haga bundlig y code splitting, esto quiere decir que empaquetamos nuestro código en archivos separados que cargan solo cuando es necesario.
El parser va a crear unos nodos basado en los tokens, cons estos nodos se va a crear el Abstract Syntax Tree.
El Abstract Syntax Tree es una estructura de datos que representan a nuestro programa.
Resumen de la clase:
Cuando un JS llega al navegador empieza un proceso ejecutado por el motor JS: agarra el código, lo deconstruye, lo construye nuevamente, lo ejecuta y lo optimiza.
.
La web
Cuando JS llega con Netscape se realizaban tareas muy simples.
Luego Google con sus productos complejos como Google maps necesitaba un navegador que ejecutara todo eficientemente. Por eso reinventó el funcionamiento del motor de JavaScipt.
.
¿Qué hace un JS engine?
El JS Engine recibe el código fuente y lo procesa de la siguiente manera:
• El parser descompone y crea tokens que integran el AST.
• Se compila a bytecode y se ejecuta.
• Lo que se pueda se optimiza a machine code y se reemplaza el código base.
Glorario:
• Bytecode: es un código de más bajo nivel que permite que se ejecute mucho más rápido.
• Profiling data: encuentra todos los puntos optimizables del código para luego dar paso al optimizer compiler
• Optimized code
.
Parser
El código JS no puede ser leído por el navegador. Por ello debe descomponerlo en pedazos llamados tokens. Con esta información se crea el ATS.
Un SyntaxError es lanzado cuando el motor JavaScript encuentra partes que no forman parte de la sintaxis del lenguaje
Existen 2 formas de hacer parser, veamos cómo lo hace el V8.
😱 Esto es otro nivel, esto literal es lo más avanzado que he visto de JS hasta el momento!!
Este es el proceso que realiza JavaScript para lograr ejecutar su código de la mejor forma posible. Ahora veamos un gráfico donde se explica mejor.
- Java
Bytecode: es un código de más bajo nivel que permite que se ejecute mucho más rápido.
Profiling data: encuentra todos los puntos optimizables del código para luego dar paso al optimizer compiler
Optimized code: A veces este proceso falla y se quita la optimización.
Este agarra tu código fuente y lo lee, pero tiene que descomponerlo primero, a estos pedazos se les llama tokens, identifica que significa cada palabra o símbolo. Una vez teniendo esta información se pasa al Abstract Syntax Tree.
Un Syntax error es lanzado cuando el motor de Js se encuentra con partes del código que no forman parte de la sintaxis del lenguaje al momento de analizar el código.
Según estadísticas de google:
La mayoría del código no se ejecuta, por esto tenemos que empaquetar nuestro código de forma eficiente, a esto se le llama bunding y code splitting, separaremos el código y lo cargaremos cuando sea necesario solamente. Esto se ve mucho en la SPA.
Existen forma de hacer parsing, concretamente dos:
Hay dos modos de hacer parsing y es lo que hace el motorde Google Chrome que se llama B8 o el de note, que es el mismo. Está el Eager y el Lazy.
Cuando se hace Eager Parsing vamos a encontrar todos los errores de sintaxis en el código que se está analizando y se va a crear el AST Que es simplemente un árbol. Hace una estructura en forma de árbol que representa tu programa y además va a construirlos scopes. Es decir, ya este momento vamos a saber qué variables se pueden leer, en qué partes del código.
Una consecuencia, Eager Parsing es que lleva mayor tiempo en cargar la página
Lazy Parsing, se está retrasando alguna parte del código que por el momento no hace falta y por ende no hace falta analizarla. Esto tiene la ventaja, que es doble de rápido.
Una consecuencia del Lazy Parsin es que el AST no se construye y los scopes se construyen parcialmente
Esta es una estructura en forma de árbol, Abstract Syntax Tree. Este empieza desde una raíz que es nuestro programa o código js y básicamente nuestro programa se descompone en partes formando una estructura lógica de árbol siguiendo los tokens que produjo el parser.
Esto tiene muchos usos sitios no solo para ejecutar un programa JavaScript también lo usamos para transformar el código de una forma a otra. Por ejemplo, lo que hace Babel. O Prettify.
Este es el link que nos dirige a la página en la que se encuentra el profesor
https://esprima.org/demo/parse.html
Exelente clase.
Muy bueno!
Tokens = palabras reservadas del lenguaje de JS
Buena expliación de JS, como funciona
Excelente información para tner en cuenta.
Me encantó esta clase, excelente explicación.
Entenido.
Ese sonido al iniciar aturde bien gacho, pero te despierta, es como un HEY! Despierta y pon atención!!! jajja
Bueno, ahí vamos.
El JS Engine recibe el código fuente y lo procesa de la siguiente manera:
El parser descompone y crea tokens que integran el AST.
Se compila a bytecode y se ejecuta.
Lo que se pueda se optimiza a machine code y se reemplaza el código base.
le pifia un poco la transcripción jajaj
¿Qué hace un parser?
Información muy útil para conocer el lenguaje y el motor a fondo
excelente explicación
Excelente clase.
Excelente clase. Se le abre uno mucho la mente!! 🤯
Gran explicación del motor de JS!
Bastante interesante…
Excelente explicacion, lo que entendí por bundling y code splitting es que cuando se pueda, es mejor usar los archivos js separados en modulos, para evitar que codigo que no es necesario se ejecute.
Parser: Descompone en código funte en Tokens para que sean crear el AST. es el 15-20% de ejecución y la mayoría de JS que se envía no se ejecuta.
Por eso el Bundling y Code Splitting es importante.
AST: Abstract Syntax Tree: ES UN GRAFO. Estructura en forma de árbol que representa un programa. Se tiene una razín que es el programa y se descompone en Tokens creados por el Parser.
Se usa en
JS Engine,
Bundlers, Rollup, Parcel.
Transpilers - Babel
Linters: ESLint, Prettify
Type Checkers - TypeScript
excelente clase.
vamos por mas!
How js works
GIGACHAD SUPREMO
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.