Javascript en el navegador#
Historia y evolución de JavaScript y ECMAScript#
Orígenes de JavaScript#
Mocha:
JavaScript se inició bajo el nombre de Mocha. Fue desarrollado por Brendan Eich en Netscape Communications en 1995. Mocha fue el nombre original durante las primeras etapas de desarrollo.
LiveScript:
Antes de ser conocido como JavaScript, el lenguaje fue renombrado a LiveScript. Este nombre se utilizó durante un breve período en 1995.
JavaScript:
Finalmente, en diciembre de 1995, el lenguaje fue renombrado a JavaScript. Este cambio de nombre se debió a una estrategia de marketing para asociarlo con el popular lenguaje de programación Java, a pesar de que JavaScript y Java son muy diferentes en su diseño y propósito.
Estándar ECMAScript#
A partir de 1997, el World Wide Web Consortium (W3C) y ECMA International comenzaron a definir las especificaciones del lenguaje JavaScript bajo el nombre de ECMAScript. Este estándar asegura la interoperabilidad y la compatibilidad del lenguaje en distintos navegadores y plataformas. El W3C se encarga también de otros protocolos y lenguajes estándar, incluso de principios éticos: https://www.w3.org/TR/ethical-web-principles/
Sintaxis y Influencias#
La sintaxis de JavaScript se inspira en lenguajes como C y Java. Sin embargo, JavaScript es fundamentalmente diferente en su propósito y funcionalidad:
C: Influye en la estructura básica y la sintaxis de control (bucles, condiciones).
Java: Inspira la sintaxis de los objetos y la programación orientada a objetos.
Versiones Importantes de ECMAScript#
ECMAScript 5th Edition (ES5):
Publicada en diciembre de 2009.
Esta versión es soportada por todos los navegadores actuales.
Introdujo características clave como el “strict mode”, métodos de array adicionales (como
forEach
,map
,filter
), y mejoras en el manejo de objetos.
ECMAScript 2015 (ES6):
También conocida como ES6, fue publicada en junio de 2015.
Es una de las actualizaciones más importantes del lenguaje, incorporando muchas características nuevas que facilitan y modernizan el desarrollo en JavaScript:
Clases: Simplifican la sintaxis para la programación orientada a objetos.
Módulos: Permiten la importación y exportación de bloques de código, mejorando la modularidad y reutilización.
Iteradores y Generadores: Facilitan el manejo de datos iterables.
Funciones Flecha: Proveen una sintaxis más corta para las funciones y cambian el comportamiento del
this
.Declaraciones
let
yconst
: Introducen alcance de bloque y constantes.Promesas: Manejan la asincronía de manera más efectiva y legible.
ECMAScript 2024:
Es la última especificación y trae consigo las actualizaciones más recientes.
En este libro se introducen instrucciones y conceptos posteriores al ES6, el cual debería ser el estándard mínimo con el que trabajaremos. Hay código ES6 que no se puede ejecutar ni transpilar fácilmente a ES5.
Integrar JS en HTML#
En primer lugar, veamos cómo integrar Javascript en el HTML para que se ejecute en el navegador:
<!-- Integración de JavaScript directamente en el HTML -->
<script type="text/javascript">
// Este es un bloque de código JavaScript embebido directamente en el documento HTML.
// Funciona para pequeños bloques en webs tradicionales. No recomendable en SPAs
console.log("Hola, este es un mensaje desde JavaScript embebido.");
</script>
<!-- Integración de un archivo JavaScript externo -->
<script type="text/javascript" src="scripts.js"></script>
<!-- Mensaje para navegadores que no soportan JavaScript -->
<noscript>
<p>Tu navegador no soporta JavaScript o está desactivado.</p>
</noscript>
<!-- Comentario: Muchas veces, los desarrolladores colocan los scripts al final del documento para asegurarse de que todo el contenido HTML se haya cargado antes de ejecutar el JavaScript. -->
Atributos async
y defer
en la Etiqueta <script>
#
A partir de HTML5, la etiqueta <script>
admite dos atributos, async
y defer
, que permiten que los scripts comiencen su descarga inmediatamente sin interrumpir el proceso de parseo del documento HTML.

Fig. 2 Diagrama del funcionamiento de Async o Defer.#
async
#
El atributo async
permite que el script se ejecute de manera asíncrona tan pronto como se haya descargado. Esto significa que:
El script se descargará en paralelo con el parseo del documento.
Se ejecutará tan pronto como la descarga haya terminado, sin esperar a que el documento se haya parseado por completo.
Los scripts marcados con
async
pueden no ejecutarse en el orden en el que aparecen en el documento HTML, ya que la ejecución depende de cuál script se descargue primero.
Ejemplo:
<script src="scripts.js" async></script>
defer
#
El atributo defer
asegura que los scripts se ejecutarán en el orden en el que aparecen en el documento HTML. Las características de defer
incluyen:
El script se descarga en paralelo con el parseo del documento, similar a
async
.La ejecución del script se pospone hasta que el documento se haya parseado completamente.
La ejecución ocurre justo antes del evento
DOMContentLoaded
, pero después de que todo el HTML haya sido procesado.
Ejemplo:
<script src="scripts.js" defer></script>
Sin async
ni defer
#
Si un script no tiene ninguno de estos atributos, el comportamiento por defecto es que el script se descarga y se ejecuta de manera síncrona. Esto significa que:
El parseo del documento se pausa hasta que el script haya sido descargado y ejecutado completamente.
Los scripts se ejecutan en el orden en que aparecen en el documento.
Ejemplo:
<script src="scripts.js"></script>
En cualquier caso, salvo ocasiones específicas, suele ser más fácil añadir un sólo script, trabajar con módulos y esperar al evento DOMContentLoaded
.
Comprobar que funciona#
Los navegadores modernos vienen con una consola de depuración muy avanzada que permite interactuar con el DOM, el CSS, el JS, la red, entre otras cosas. La abriremos con F12 o el botón derecho y la mantendremos abierta casi todo el tiempo.

Fig. 3 Lo que se ve si pulsamos F12.#
Podemos ejecutar algo como:
console.log("hola mundo")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[1], line 1
----> 1 console.log("hola mundo")
NameError: name 'console' is not defined
Ocultar el código JavaScript#
No es posible ocultar completamente el código JavaScript. El código que se ejecuta en el lado del cliente (es decir, en el navegador web) siempre puede ser visto por los usuarios, ya que se descarga junto con el resto del contenido de la página web.
Aunque no se puede ocultar el código, sí se pueden utilizar técnicas para ofuscar y comprimir el código JavaScript. Estas técnicas dificultan la lectura y comprensión del código por parte de personas, aunque no lo hacen completamente inaccesible.
Tal vez, por eso, muchos proyectos de JS son directamente publicados como Open Source
El siguiente código es un ejemplo:
var _0x47a0=['log','Hello\x20World!']; (function (_0x558f55,_0x47a08a){var _0x257f99= function (_0x256ed6)
{while(--_0x256ed6) {_0x558f55['push'] (_0x558f55['shift']()); }};_0x257f99(++_0x47a08a);}
(_0x47a0,0x1cb));var _0x257f =function(_0x558f55,_0x47a08a){_0x558f55=_0x558f55-0x0;
var _0x257f99=_0x47a0[_0x558f55];return _0x257f99;};function hi(){console[_0x257f('0x1')](_0x257f('0x0'));}hi();
Hello World!