JavaScript: el lenguaje más incomprendido

Ramón Saquete

Escrito por Ramón Saquete

JavaScript es, por necesidad, uno de los lenguajes de programación Web más utilizados. En contraposición, sus bases y principios más fundamentales no son entendidos por la mayoría de desarrolladores que creen conocer medianamente bien el lenguaje. Para saber cómo se ha llegado a esta situación debemos conocer  su evolución a lo largo de la corta historia de la Web:

Brendan Eich CEO de la fundación Mozilla y creador de JavaScript
Brendan Eich

Corría el año 1995 cuando a Brendan Eich le encargaron desarrollar un lenguaje de Script para la versión 2.0 del anteriormente famoso “Netscape Navigator”. Netscape había añadido recientemente compatibilidad con la tecnología Java de Sun, así que le pidieron a Brendan que desarrollara un lenguaje que fuera como el hermano tonto de Java y así nació JavaScript, como un lenguaje tan simple que hasta los aficionados podían ser capaces de usarlo. Por cierto, si no queréis parecer aficionados, nunca cometáis el clásico error de referirse a JavaScript como Java.

Microsoft tuvo que incorporar a Internet Explorer este nuevo lenguaje de script para poder ser competitivos en la carrera tecnológica de la Web.

Pero el tiempo pasó, Netscape perdió la guerra de los navegadores con Microsoft y sus desarrolladores liderados por Brendan, formaron la fundación Mozilla que actualmente organiza el desarrollo de las siguientes versiones de JavaScript. Es por ello que su navegador, Firefox, es el que mejor soporta las nuevas funcionalidades del lenguaje.

Puesto que el lenguaje debía de evolucionar y todos los navegadores debían  funcionar de la misma forma con las nuevas funcionalidades, en 1997, se creó el estándar ECMAScript que sirve de base para el desarrollo de las versiones de JavaScript y otros lenguajes de script, siendo actualmente la última versión de ECMAScript la 5 y de JavaScript la 1.8. Debido a esta evolución del lenguaje, a que las Webs cada vez eran más complejas y al uso de AJAX, los ingenieros empezamos a tomar más interés por el lenguaje. Algunos empezaron a crear librerías muy potentes como Prototype, MooTools, jQuery, que hacen más fácil el uso del lenguaje y mejoran su interoperabilidad entre navegadores. Además, desde hace pocos años, se ha mejorado mucho su rendimiento, pasando de ser un lenguaje interpretado a un lenguaje compilado en tiempo de ejecución.

framework de javascript jquery
Llegados a este punto surgen muchos programadores que a base de librerías desarrolladas por otros pueden aparentar que saben JavaScript, hasta que se les pide desarrollar algo fuera de lo que les permite la librería o los plugins que puedan encontrar. Plugins que muchas veces están desarrollados por gente que tampoco entiende muy bien el lenguaje, con lo que nos podemos encontrar con fallos graves, como fugas de memoria que provocan que se cuelgue el equipo al dejar la página abierta durante un rato.

node.js javascript en el servidor
Cuando JavaScript se usa en el servidor, con el ya no tan reciente Node.js, la situación es mucho peor, en un entorno donde casi todas las llamadas son asíncronas, donde se necesita implementar mucho más código y los desarrolladores no entienden el lenguaje, se genera en el código una cantidad de espaguetización, repetición y errores que hace que este tipo de proyectos sean imposibles de mantener.

El problema de estos desarrolladores, es que aprendieron a utilizar el lenguaje hace años e incluso con libros y tutoriales anticuados, quedándose con la falsa sensación de que ya dominaban el lenguaje para siempre, pero esa no es la realidad. JavaScript, como el resto de tecnologías de la Web, es un lenguaje que nunca se conoce del todo porque está en constante evolución, y el que no tiene capacidad de ser autodidacta, no puede seguirlo. Muchos de los desarrolladores que aprendieron de la documentación que había para las primeras versiones de JavaScript, cuando este era un lenguaje fácil, se han perdido cómo éste ha evolucionado a un tipo de lenguaje orientado a objetos que no se parece a ningún otro.

Conceptos básicos como las clausuras, la herencia prototípica, interpretar el contexto de this según sea la llamada o simplemente entender cuál es el ámbito de una variable, son conceptos que a muchos programadores o les suenan a chino o no saben que hay que entenderlos de forma diferente en JavaScript. Estas características distintas que tiene el actual JavaScript respecto al resto de lenguajes, es lo que lo convierte en uno de los lenguajes más difíciles de aprender.

A modo de pasatiempo, os dejo un ejemplo donde es necesario conocer estos conceptos y algunos más como el hoisting, para saber simplemente cuáles son los valores de unas variables:

function foo1(){
this.var1 = 2;
this.var2 = 3;
var4 = 10;
var var5 = 11;
}

function foo2(){
this.var1 = 0;
this.var4 = 7;
}

var obja = new foo2();
foo2.prototype.var3 = 5; 
foo2.prototype = new foo1(); 
foo2.prototype.var3 = 6; 
var objb = new foo2();
var objc = new foo2();
objb.var4 = 8;

console.log("obja.var3: " + obja.var3);
console.log("obja.var2: " + obja.var2);
console.log("objb.var3: " + objb.var3);
console.log("objb.var1: " + objb.var1);
console.log("objb['var4']: " + objb['var4']);
console.log("objb.var2: " + objb.var2);
obja.var1 = 10;
obja.constructor.prototype.var2 = 9;
console.log("objc.var1: " + objc.var1);
console.log("objc.var2: " + objc.var2);
console.log("var4: " + var4);
console.log("(typeof var5): " + (typeof var5));

var var6 = '!';
var foo3 = function(var7){
console.log("(typeof var6) +' '+ var4: " + (typeof var6) + ' ' + var4);
var var6 = 'hola'; 
this.var6 = 'adios';
return function(var7){
var var8 = {};
var8.a = 12;
var var9 = 14;

this.show = function(){
console.log( 'var6 + var7: ' + var6 + var7 );
};
this.getVar8 = function(){
return var8;
};
this.getVar9 = function(){
return var9;
};

};
}();
foo3.var6 = 'adios';

var objd = new foo3(' mundo');
objd.show();
var aux = objd.getVar8();
aux['a'] = 13
aux = objd.getVar9();
aux = 15;
console.log('objd.getVar8().a '+objd.getVar8().a);
console.log('objd.getVar9() '+objd.getVar9());
foo4.apply(obja);
console.log(var6);

function foo4(){
console.log('this.var1: ' + this.var1);
}

Si tenéis los conocimientos y las ganas necesarias os animo a dejar en los comentarios, la explicación de por qué cada variable toma cada valor en cada línea mostrada en la consola. Si nadie consigue resolver todo y alguien lo pide os dejaré la solución.

Cuando hablamos de código de cliente en un navegador, este desconocimiento se extiende más allá del lenguaje y los métodos definidos en ECMAScript, alcanzando a los objetos del DOM y el BOM que provee el navegador al lenguaje. Por ejemplo, no es raro encontrarse programadores que nunca han oído hablar del burbujeo o la captura de eventos definidos en el DOM Level 2 (la última especificación es la 3 y se está desarrollando la 4) y no hablemos ya de extensiones y APIS nuevas definidas por el WHATWG en la especificación de HTML5 como por ejemplo los Web workers, los Web Sockets o el Web storage.

Si nos vamos a conceptos avanzados del lenguaje lo que le ocurre al 99% de los desarrolladores, no es que les suene a chino, si no a la lengua de los cielos, que es lo que dicen los chinos cuando quieren decir que algo les suena a chino. Estoy refiriéndome a conceptos como patrones de programación (por ejemplo el currying o el memoization), saber cómo medir el rendimiento y cómo se debe optimizar el código, saber qué partes no se deben usar (que se han mantenido por compatibilidad regresiva), entender la complejidad ciclomática, saber usar las herramientas para medir la calidad del código, herramientas para realizar pruebas unitarias, etc.

  •  | 
  • Publicado el
Ramón Saquete
Ramón Saquete
Desarrollador web y consultor SEO técnico en Human Level. Graduado en Ingeniería Informática e Ingeniería Técnica en Informática de Sistemas. También es Técnico Superior en Desarrollo de Aplicaciones Informáticas y posteriormente obtuvo la Certificación de Aptitud Pedagógica. Experto en WPO e indexabilidad.

2 comentarios

¿Y tú qué opinas? Deja un comentario

Por si acaso, tu email no se mostrará ;)

  1. Uno de los mayores desafíos para alguien que proviene de una escuela de diseño es entrar de lleno en el mundo del lenguaje de programación y scripting.

    Hay algun libro o buena guía para comprender mejor esto?

    Muchos Saludos.

    1. Hola Cristopher,
      En efecto, si provienes de cualquier otro sector que no tenga nada que ver, entrar en el mundo de la programación es muy complicado. Requiere de mucho estudio, mucha práctica y mucha experiencia, además es algo que nunca se deja de aprender, siempre será mejor programador el que lleva 20 años programando que el que lleva 10. Si estas empezando no te recomiendo que lo hagas con JavaScript, puesto que JavaScript es la excepción y no la norma en los lenguajes de programación.
      Lo mejor es que empieces con algo de pseudocódigo, después pruebes C (te recomiendo el libro «El lenguaje de programación C» de Dennis Ritchie y Brian Kernighan), luego algo de POO con C++ o C# y por último que saltes a JavaScript, donde te recomiendo que te leas todos los libros que puedas, porque nunca serán suficientes, empieza con tutoriales básicos, aprende a usar el lenguaje desde cero, luego con jQuery y cuando ya te sientas más cómodo, leete cosas más avanzadas, como mínimo el libro «The secrets of the JavaScript Ninja» del famoso autor de la librería jQuery, John Resig, y el libro «JavaScript: The Good parts» del también famoso autor del formato JSON y otras características de JavaScript, Douglas Crockford.
      Saludos

es