JavaScript fue desarrollado originalmente por Brendan Eich de Netscape con el nombre de Mocha, el cual fue renombrado
posteriormente a LiveScript, para
finalmente quedar como JavaScript. El cambio de nombre coincidió
aproximadamente con el momento en que Netscape agregó soporte para la
tecnología Java en su navegador
web Netscape Navigator en la
versión 2.002 en diciembre de 1995. La denominación produjo confusión, dando la
impresión de que el lenguaje es una prolongación de Java, y se ha caracterizado
por muchos como una estrategia de mercadotecnia de Netscape para obtener
prestigio e innovar en lo que eran los nuevos lenguajes de programación web.
«JavaScript» es una marca
registrada de Oracle Corporation. Es usada con licencia por
los productos creados por Netscape
Communications y entidades actuales como
la Fundación Mozilla.
Microsoft dio como nombre a su dialecto de JavaScript «JScript»,
para evitar problemas relacionadas con la marca. JScript fue adoptado en la
versión 3.0 de Internet Explorer, liberado en agosto de 1996, e incluyó
compatibilidad con el Efecto
2000 con las funciones de fecha, una diferencia de
los que se basaban en ese momento. Los dialectos pueden parecer tan similares
que los términos «JavaScript» y «JScript» a menudo se utilizan indistintamente,
pero la especificación de JScript es incompatible con la de ECMA en muchos
aspectos.
Para evitar estas incompatibilidades, el World Wide Web Consortium diseñó el estándar Document Object Model (DOM, o Modelo de Objetos del Documento en
español), que incorporan Konqueror, las versiones 6
de Internet
Explorer y Netscape Navigator, Opera la versión 7, Mozilla Application Suite y Mozilla Firefox desde su primera versión.
En 1997 los autores propusieron8 JavaScript para que fuera adoptado como
estándar de la European Computer Manufacturers 'Association ECMA,
que a pesar de su nombre no es europeo sino internacional, con sede en Ginebra.
En junio de 1997 fue adoptado como un estándar ECMA, con el nombre de ECMAScript.
Poco después también como un estándar ISO.
JavaScript en el lado servidor
Netscape introdujo una implementación de script del lado del servidor con Netscape Enterprise Server,
lanzada en diciembre de 1994 (poco después del lanzamiento de JavaScript para
navegadores web). A partir
de mediados de la década de los 2000, ha habido una proliferación de
implementaciones de JavaScript para el lado servidor. Node.js es uno de
los notables ejemplos de JavaScript en el lado del servidor, siendo usado en
proyectos importantes.
Desarrollos posteriores
JavaScript se ha convertido en uno de los lenguajes de
programación más populares en internet. Al principio, sin embargo, muchos
desarrolladores renegaban el lenguaje porque el público al que va dirigido lo
formaban publicadores de artículos y demás aficionados, entre otras razones. La llegada de Ajax devolvió JavaScript a la fama y atrajo la
atención de muchos otros programadores. Como resultado de esto hubo una
proliferación de un conjunto de frameworks
y librerías de ámbito general,
mejorando las prácticas de programación con JavaScript, y aumentado el uso de
JavaScript fuera de los navegadores web, como se ha visto con la proliferación de
entornos JavaScript del lado del servidor. En enero de
2009, el proyecto CommonJS fue inaugurado con el objetivo de especificar
una librería para uso de tareas comunes principalmente para el desarrollo fuera
del navegador web.
Las siguientes características son comunes a todas las
implementaciones que se ajustan al estándar ECMAScript, a menos que especifique
explícitamente en caso contrario.
Imperativo y estructurado
JavaScript soporta gran parte de la estructura de programación de C (por ejemplo, sentencias
if
, bucles for
, sentencias switch
, etc.). Con un salvedad,
en parte: en C, elámbito de las variables alcanza al bloque en el cual
fueron definidas; sin embargo en JavaScript esto no es soportado, puesto que el
ámbito de las variables es el de la función en la cual fueron declaradas. Esto
cambia con la versión de JavaScript 1.7, ya que soporta block scoping por medio
de la palabra clave let
. Como en
C, JavaScript hace distinción entre expresiones y sentencias. Una diferencia sintáctica con
respecto a C es la inserción automática de punto y coma, es decir, en
JavaScript los puntos y coma que finalizan una sentencia pueden ser omitidos.
Dinámico
Tipado
dinámico
Como en la mayoría de lenguajes
de scripting, el tipo está asociado al valor, no a la variable. Por
ejemplo, una variable
x
en un momento dado puede estar ligada a un
número y más adelante, religada a una cadena.
JavaScript soporta varias formas de comprobar el tipo de un objeto, incluyendo duck
typing. Una forma de saberlo es por medio de la
palabra clave typeof.
Objetual
JavaScript esta formado casi en
su totalidad por objetos. Los objetos en
JavaScript son arrays asociativos,
mejorados con la inclusión de prototipos (ver más adelante). Los nombres de las
propiedades de los objetos son claves de tipo cadena:
obj.x = 10
y obj['x'] = 10
son equivalentes, siendo la notación con
punto azúcar sintáctico. Las propiedades y sus
valores pueden ser creados, cambiados o eliminados en tiempo de ejecución. La
mayoría de propiedades de un objeto (y aquellas que son incluidas por la cadena
de la herencia prototípica) pueden ser enumeradas a por medio de la instrucción
de bucle for... in
. JavaScript tiene un pequeño
número de objetos predefinidos como son Function
y Date
.
Evaluación en tiempo de ejecución
JavaScript incluye la función
eval
que
permite evaluar expresiones como expresadas como cadenas en tiempo de
ejecución. Por ello se recomienda que eval sea utilizado con precaución y que
se opte por utilizar la función JSON.parse()
en la medida de lo posible, pues resulta
mucho más segura.
Funcional
Funciones de primera clase
A las funciones se les suele llamar ciudadanos de primera
clase; son objetos en sí mismos. Como tal, poseen propiedades y métodos, como
.call()
y .bind()
. Una función anidada es una función definida
dentro de otra. Esta es creada cada vez que la función externa es invocada.
Además, cada función creada forma una clausura; es
el resultado de evaluar un ámbito conteniendo en una o más variables
dependientes de otro ámbito externo, incluyendo constantes, variables locales y
argumentos de la función externa llamante. El resultado de la evaluación de
dicha clausura forma parte del estado interno de cada objeto función, incluso
después de que la función exterior concluya su evaluación.
Prototípico
JavaScript usa prototipos en vez de clases para el uso de herencia.Es posible llegar a emular muchas de
las características que proporcionan las clases en lenguajes orientados a
objetos tradicionales por medio de prototipos en JavaScript.
Funciones como constructores de
objetos
Las funciones también se
comportan como constructores. Prefijar una llamada a la función con la palabra
clave
new
crear una
nueva instancia de un prototipo, que heredan propiedades y métodos del
constructor (incluidas las propiedades del prototipo de Object
). ECMAScript 5 ofrece el método Object.create
, permitiendo la creación
explícita de una instancia sin tener que heredar automáticamente del prototipo
de Object (en entornos antiguos puede aparecer el prototipo del objeto creado
como null
). La propiedad prototype
del
constructor determina el objeto usado para el prototipo interno de los nuevos
objetos creados. Se pueden añadir nuevos métodos modificando el prototipo del
objeto usado como constructor. Constructores predefinidos en JavaScript, como Array
u Object
, también tienen prototipos que
pueden ser modificados. Aunque esto sea posible se considera una mala práctica
modificar el prototipo de Object ya que la mayoría de los objetos en Javascript
heredan los métodos y propiedades del objeto prototype, objetos los cuales
pueden esperar que estos no hayan sido modificados
Otras características
Entorno de ejecución
JavaScript normalmente depende
del entorno en el que se ejecute (por ejemplo, en un navegador
web) para ofrecer objetos y métodos por los que los scripts pueden
interactuar con el "mundo exterior". De hecho, depende del entorno
para ser capaz de proporcionar la capacidad de incluir o importar scripts (por
ejemplo, en HTML por medio del tag
<script>
). (Esto
no es una característica del lenguaje per se, pero es común en la mayoría de
las implementaciones de JavaScript.)
Funciones variadicas
Un número indefinido de
parámetros pueden ser pasados a la función. La función puede acceder a ellos a
través de los parámetros o también a través del objeto local
arguments
. Las funciones variadicas también pueden ser creadas usando el método .apply()
.
Funciones como métodos
A diferencia de muchos lenguajes
orientados a objetos, no hay distinción entre la definición de función y la
definición de método. Más bien, la
distinción se produce durante la llamada a la función; una función puede ser
llamada como un método. Cuando una función es llamada como un método de un objeto,
la palabra clave
this
, que es
una variable local a la función, representa al objeto que invocó dicha función.
Arrays y la definición literal de
objetos
Al igual que muchos lenguajes de
script, arrays y objetos (arrays
asociativos en otros
idiomas) pueden ser creados con una sintaxis abreviada. De hecho, estos
literales forman la base del formato de datos JSON.
Expresiones regulares
JavaScript también soporta expresiones regulares de una manera similar a Perl,
que proporcionan una sintaxis concisa y poderosa para la manipulación de texto
que es más sofisticado que las funciones incorporadas a los objetos de tipo
string.
Ejemplo de script
A continuación se muestra un breve ejemplo de una página web
(ajustadose a las normas del estándar para HTML5)
que utiliza JavaScript para el manejo del DOM:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ejemplo sencillo</title>
<h1 id="header">Esto es JavaScript</h1>
<script>
document.body.appendChild(document.createTextNode('Hola Mundo!'));
var h1 = document.getElementById('header'); // contiene la referencia al tag <h1>
h1 = document.getElementsByTagName('h1')[0]; // accediendo al mismo elemento <h1>
</script>
<noscript>Tu navegador o no soporta JavaScript, o ha sido deshabilitado. </noscript>
</head>
<body>/*...*/</body>
</html>
Consideraciones
acerca de la compatibilidad
Debido a que JavaScript se ejecuta en entornos muy variados, una
parte importante de las pruebas y la depuración es probar y verificar que el
código JavaScript funciona correctamente en múltiples navegadores. La interfaz
DOM para acceder y manipular páginas web no es parte del estándar ECMAScript, o
de la propia JavaScript. El DOM es definido por los esfuerzos de
estandarización del W3C, una organización
independiente. En la práctica, las implementaciones que hacen de JavaScript los
distintos navegadores difieren tanto entre ellos mismos como de las normas del
estándar.
Para hacer frente a estas diferencias, los autores de JavaScript
pudieron ser capaces de escribir código compatible con los estándares que
también fuera capaz de ejecutarse correctamente en la mayoría de los
navegadores, o en su defecto, que al menos se pudiera escribir código capaz de
comprobar la presencia de ciertas funcionalidades del navegador y que se
comportase de manera diferente si no se dispusiese de dicha funcionalidad. Existen casos en los que dos navegadores
pueden llegar a implementar la misma característica, pero con un comportamiento
diferente, hecho que a los programadores les puede resultar de ayuda para
detectar qué navegador se está ejecutando en ese instante y así cambiar el
comportamiento de su escritura para que coincida. Los programadores también suelen utilizar
bibliotecas o herramientas que tengan en cuenta las diferencias entre
navegadores.
Además, los scripts pueden no funcionar para algunos usuarios. Por
ejemplo, un usuario puede:
·
utilizar un navegador antiguo el cual tenga soporte de la API DOM
incompleto,
·
utilizar un navegador PDA o teléfono móvil que no puede ejecutar
JavaScript
·
tener la ejecución de JavaScript deshabilitada, como precaución de
seguridad,
·
utilizar un navegador de voz debido a, por ejemplo, una
discapacidad visual.
Para apoyar a estos usuarios, los programadores web suelen crear
páginas que sean tolerante a fallos según el agente de usuario (tipo de
navegador) que no soporten JavaScript. En particular, la página debe seguir
siendo útil aunque sin las características adicionales que JavaScript habría
añadido. Un enfoque alternativo que muchos encuentran preferible es primero
crear contenido utilizando las tecnologías que funcionan en todos los
navegadores, y mejorar el contenido para los usuarios que han permitido
JavaScript.
Accesibilidad
Los lectores de pantalla, utilizados por los
ciegos y deficientes visuales, pueden ser tenidos en cuenta por JavaScript y
así poder acceder y leer los elementos DOM de la página. El código HTML escrito
debe ser lo más conciso, navegable y semánticamente rico posible, tanto si JavaScript
se ejecuta como si no.
JavaScript no debería de ser totalmente dependiente de los eventos
de ratón del navegador y debería dar soporte para aquellos usuarios que quieran
no hacer uso del ratón
(informática) para navegar o que opten
por utilizar solamente el teclado. Hay eventos independientes del dispositivo,
tales como
onfocus
y onchange
que son preferibles en la mayoría de los
casos.
JavaScript no debe ser utilizado para crear confusión o
desorientación al usuario web. Por ejemplo, modificar o desactivar la
funcionalidad normal del navegador, como cambiar la forma en que el botón de de
navegar hacia atrás o el evento de actualización se comportan, son prácticas
que generalmente son mejores evitar. Igualmente, desencadenar eventos que el
usuario puede no tener en cuenta reduce la sensación de control del usuario y
provoca cambios inesperados al contenido de la página.
A menudo, el proceso de dotar a una página web compleja el mayor
grado accesibilidad posible, se convierte en un problema no trivial donde muchos temas se acaban llevando al
debate y a la opinión, siendo necesario el compromiso de todos hasta el final.
Sin embargo, los agentes de usuario y las tecnologías de apoyo a personas con
discapacidad están en constante evolución y nuevas directrices e información al
respecto siguen publicándose en la web.
HERRAMIENTAS DE DESARROLLO
En JavaScript, disponer de un depurador se convierte en necesario
cuando se desarrollan grandes aplicaciones, no triviales. Dado que puede haber
diferencias de implementación entre los diferentes navegadores (especialmente
en cuanto al DOM), es útil tener acceso a un depurador para cada uno de los
navegadores a los cuales nuestra aplicación web irá dirigido.
Los depuradores web están disponibles para Internet Explorer,
Firefox, Safari, Google Chrome y Opera.
Existen tres depuradores disponibles para Internet Explorer: Microsoft Visual Studio es el más avanzado de los tres,
seguido de cerca por Microsoft Script Editor (un componente de Microsoft Office) y, finalmente, Microsoft Script
Debugger, que es mucho más básico que el otro dos, aunque es gratuito. El IDE gratuito
Microsoft Visual Web Developer Express ofrece una versión limitada de la
funcionalidad de depuración de JavaScript en el Microsoft Visual Studio.
Internet Explorer ha incluido herramientas de desarrollo desde la versión 8 (se
muestra pulsando la tecla F12). Las aplicaciones web dentro de Firefox se pueden depurar usando el Firebug add-on o el antiguo depurador Venkman.
Firefox también tiene integrada un consola de errores básica, que registra y
evalúa JavaScript. También registra errores de CSS y
advertencias. Opera incluye un conjunto de herramientas llamado Dragonfly. El Inspector Web de WebKit incluye un depurador de JavaScript utilizado en Safari, junto con una versión
modificada de Google Chrome.
Existen algunas herramientas de ayuda a la depuración, también
escritas en JavaScript y construidas para ejecutarse en la Web. Un ejemplo es
el programa JSLint, desarrollado
por Douglas Crockford, quien ha
escrito extensamente sobre el lenguaje. JSLint analiza el código JavaScript
para que este quede conforme con un conjunto de normas y directrices y que
aseguran su correcto funcionamiento y mantenibilidad.
No hay comentarios:
Publicar un comentario