Sei sulla pagina 1di 9

JavaScript

JavaScript (abreviado comnmente "JS") es un lenguaje


de programacin interpretado, dialecto del estndar
ECMAScript. Se dene como orientado a objetos,[3]
basado en prototipos, imperativo, dbilmente tipado y dinmico.

mercadotecnia de Netscape para obtener prestigio e innovar en lo que eran los nuevos lenguajes de programacin
web.[5][6]

JavaScript se dise con una sintaxis similar al C, aunque adopta nombres y convenciones del lenguaje de programacin Java. Sin embargo Java y JavaScript no estn
relacionados y tienen semnticas y propsitos diferentes.

dialectos pueden parecer tan similares que los trminos


JavaScript y JScript a menudo se utilizan indistintamente, pero la especicacin de JScript es incompatible
con la de ECMA en muchos aspectos.

JAVASCRIPT es una marca registrada de Oracle Corporation.[7] Es usada con licencia por los productos creaSe utiliza principalmente en su forma del lado del cliente dos por Netscape Communications y entidades actuales
(client-side), implementado como parte de un navegador como la Fundacin Mozilla.[8][9]
web permitiendo mejoras en la interfaz de usuario y Microsoft dio como nombre a su dialecto de JavaScript
pginas web dinmicas[4] aunque existe una forma de Ja- JScript, para evitar problemas relacionadas con la marvaScript del lado del servidor (Server-side JavaScript o ca. JScript fue adoptado en la versin 3.0 de Internet ExSSJS). Su uso en aplicaciones externas a la web, por ejem- plorer, liberado en agosto de 1996, e incluy compatibiplo en documentos PDF, aplicaciones de escritorio (ma- lidad con el Efecto 2000 con las funciones de fecha, una
yoritariamente widgets) es tambin signicativo.
diferencia de los que se basaban en ese momento. Los

Para evitar estas incompatibilidades, el World Wide Web


Consortium dise el estndar Document Object Model
(DOM, o Modelo de Objetos del Documento en espaol),
que incorporan Konqueror, las versiones 6 de Internet Explorer y Netscape Navigator, Opera la versin 7, Mozilla
Suite y Mozilla Firefox desde su primera
Tradicionalmente se vena utilizando en pginas web Application
[cita requerida]
versin.
HTML para realizar operaciones y nicamente en el marco de la aplicacin cliente, sin acceso a funciones del En 1997 los autores propusieron[10] JavaScript para que
servidor. JavaScript se interpreta en el agente de usuario, fuera adoptado como estndar de la European Compual mismo tiempo que las sentencias van descargndose ter Manufacturers 'Association ECMA, que a pesar de su
junto con el cdigo HTML.
nombre no es europeo sino internacional, con sede en Ginebra. En junio de 1997 fue adoptado como un estndar
Una cuarta edicin est en desarrollo e incluir nuevas
caractersticas tales como paquetes, espacio de nombres ECMA, con el nombre de ECMAScript. Poco despus
tambin como un estndar ISO.
y denicin explcita de clases.[cita requerida]
Todos los navegadores modernos interpretan el cdigo
JavaScript integrado en las pginas web. Para interactuar con una pgina web se provee al lenguaje JavaScript de una implementacin del Document Object Model (DOM).

1
1.1

Historia
Nacimiento de JavaScript

1.2 JavaScript en el lado servidor

JavaScript fue desarrollado originalmente por Brendan


Eich de Netscape con el nombre de Mocha, el cual fue
renombrado posteriormente a LiveScript, para nalmente
quedar como JavaScript. El cambio de nombre coincidi
aproximadamente con el momento en que Netscape agreg compatibilidad con la tecnologa Java en su navegador
web Netscape Navigator en la versin 2.002 en diciembre
de 1995. La denominacin produjo confusin, dando la
impresin de que el lenguaje es una prolongacin de Java,
y se ha caracterizado por muchos como una estrategia de

Netscape introdujo una implementacin de script del lado del servidor con Netscape Enterprise Server, lanzada
en diciembre de 1994 (poco despus del lanzamiento de
JavaScript para navegadores web).[11][12] A partir de mediados de la dcada de los 2000, ha habido una proliferacin 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.[13][14]
1

1.3

Desarrollos posteriores

CARACTERSTICAS

asociativos, mejorados con la inclusin de prototipos (ver ms 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 notacin con punto azcar sintctico. Las propiedades y
sus valores pueden ser creados, cambiados o eliminados en tiempo de ejecucin. La mayora de propiedades de un objeto (y aquellas que son incluidas
por la cadena de la herencia prototpica) pueden ser
enumeradas a por medio de la instruccin de bucle
for... in. JavaScript tiene un pequeo nmero de objetos predenidos como son Function y Date.

JavaScript se ha convertido en uno de los lenguajes de


programacin ms populares en internet. Al principio, sin
embargo, muchos desarrolladores renegaban del lenguaje porque el pblico al que va dirigido lo formaban publicadores de artculos y dems acionados, entre otras
razones.[15] La llegada de Ajax devolvi JavaScript a la
fama y atrajo la atencin de muchos otros programadores. Como resultado de esto hubo una proliferacin de
un conjunto de frameworks y libreras de mbito general,
mejorando las prcticas de programacin con JavaScript,
y aumentado el uso de JavaScript fuera de los navegadores web, como se ha visto con la proliferacin de entorEvaluacin en tiempo de ejecucin JavaScript incluye
nos JavaScript del lado del servidor. En enero de 2009, el
la funcin eval que permite evaluar expresiones coproyecto CommonJS fue inaugurado con el objetivo de
mo expresadas como cadenas en tiempo de ejecuespecicar una librera para uso de tareas comunes princin. Por ello se recomienda que eval sea utilizado
cipalmente para el desarrollo fuera del navegador web.[16]
con precaucin y que se opte por utilizar la funcin
JSON.parse() en la medida de lo posible, pues resulta mucho ms segura.

Caractersticas

Las siguientes caractersticas son comunes a todas las im- 2.3 Funcional
plementaciones que se ajustan al estndar ECMAScript, a
menos que especique explcitamente en caso contrario. 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 mto2.1 Imperativo y estructurado
dos, como .call() y .bind().[19] Una funcin anidada
es una funcin denida dentro de otra. Esta es creaJavaScript es compatible con gran parte de la estructura
da cada vez que la funcin externa es invocada. Adede programacin de C (por ejemplo, sentencias if, bucles
ms, cada funcin creada forma una clausura; es el
for, sentencias switch, etc.). Con una salvedad, en parte:
resultado de evaluar un mbito conteniendo en una o
en C, el mbito de las variables alcanza al bloque en el
ms variables dependientes de otro mbito externo,
cual fueron denidas; sin embargo JavaScript no es comincluyendo constantes, variables locales y argumenpatible con esto, puesto que el mbito de las variables es
tos de la funcin externa llamante. El resultado de la
el de la funcin en la cual fueron declaradas. Esto cambia
evaluacin de dicha clausura forma parte del estado
con la versin de JavaScript 1.7, ya que aade compatibiinterno de cada objeto funcin, incluso despus de
lidad con block scoping por medio de la palabra clave let.
que la funcin exterior concluya su evaluacin.[20]
Como en C, JavaScript hace distincin entre expresiones
y sentencias. Una diferencia sintctica con respecto a C
es la insercin automtica de punto y coma, es decir, en
2.4 Prototpico
JavaScript los puntos y coma que nalizan una sentencia
pueden ser omitidos.[17]
Prototipos JavaScript usa prototipos en vez de clases
para el uso de herencia.[21] Es posible llegar a emular
muchas de las caractersticas que proporcionan las
2.2 Dinmico
clases en lenguajes orientados a objetos tradicionales por medio de prototipos en JavaScript.[22]
Tipado dinmico Como en la mayora de lenguajes de
scripting, el tipo est asociado al valor, no a la variable. Por ejemplo, una variable x en un momento Funciones como constructores de objetos Las funciodado puede estar ligada a un nmero y ms adelante,
nes tambin se comportan como constructores. Prereligada a una cadena. JavaScript es compatible con
jar una llamada a la funcin con la palabra clave
varias formas de comprobar el tipo de un objeto, innew crear una nueva instancia de un prototipo, que
cluyendo duck typing.[18] Una forma de saberlo es
heredan propiedades y mtodos del constructor (inpor medio de la palabra clave typeof.
cluidas las propiedades del prototipo de Object).[23]
Objetual JavaScript est formado casi en su totalidad
por objetos. Los objetos en JavaScript son arrays

ECMAScript 5 ofrece el mtodo Object.create, permitiendo la creacin explcita de una instancia sin
tener que heredar automticamente del prototipo de

2.6

Extensiones especcas del fabricante


Object (en entornos antiguos puede aparecer el prototipo del objeto creado como null).[24] La propiedad prototype del constructor determina el objeto
usado para el prototipo interno de los nuevos objetos
creados. Se pueden aadir nuevos mtodos modicando el prototipo del objeto usado como constructor. Constructores predenidos en JavaScript, como Array u Object, tambin tienen prototipos que
pueden ser modicados. Aunque esto sea posible se
considera una mala prctica modicar el prototipo
de Object ya que la mayora de los objetos en Javascript heredan los mtodos y propiedades del objeto
prototype, objetos los cuales pueden esperar que estos no hayan sido modicados.[25]

2.5

Otras caractersticas

Entorno de ejecucin JavaScript normalmente depende del entorno en el que se ejecute (por ejemplo,
en un navegador web) para ofrecer objetos y mtodos 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 caracterstica del lenguaje, pero es comn en la mayora de
las implementaciones de JavaScript.)
Funciones varidicas Un nmero indenido de parmetros pueden ser pasados a la funcin. La funcin puede acceder a ellos a travs de los parmetros o tambin a travs del objeto local arguments.
Las funciones varidicas tambin pueden ser creadas usando el mtodo .apply().

2.6 Extensiones especcas del fabricante


JavaScript se encuentra ocialmente bajo la organizacin
de Mozilla Foundation, y peridicamente se aaden nuevas caractersticas del lenguaje. Sin embargo, slo algunos motores JavaScript son compatibles con estas caractersticas:
Las propiedades get y set (tambin compatibles con
WebKit, Opera,[27] ActionScript y Rhino).[28]
Clusulas catch condicionales.
Protocolo iterador adoptado de Python.
Corrutinas tambin adoptadas de Python.
Generacin de listas y expresiones por comprensin
tambin adoptado de Python.
Establecer el mbito a bloque a travs de la palabra
clave let.
Desestructuracin de arrays y objetos (forma limita
de emparejamiento de patrones).
Expresiones concretas en funciones (function(args)
expr).
ECMAScript para XML (E4X), una extensin que
aade compatibilidad nativa XML a ECMAScript.

3 Sintaxis y semntica
A partir del 2011, la ltima versin del lenguaje es JavaScript 1.8.5. Es un superconjunto de la especicacin
ECMAScript (ECMA-262) Edicin 3. Extensiones del
lenguaje, que incluyen compatibilidad parcial con ECMAScript para XML (E4X) (ECMA-357) y caractersticas experimentales consideradas para ser incluidas en futuras ediciones del ECMAScript, documentadas aqu.[29]

Funciones como mtodos A diferencia de muchos lenguajes orientados a objetos, no hay distincin entre
la denicin de funcin y la denicin de mtodo.
Ms bien, la distincin se produce durante la llamada a la funcin; una funcin puede ser llamada como
un mtodo. Cuando una funcin es llamada como un
mtodo de un objeto, la palabra clave this, que es
una variable local a la funcin, representa al objeto 3.1 Ejemplos sencillos
que invoc dicha funcin.
Las variables en JavaScript se denen usando la palabra
Arrays y la denicin literal de objetos Al igual que clave var:[30]
muchos lenguajes de script, arrays y objetos (arrays var x; // dene la variable x, aunque no tiene ningn valor
asociativos en otros idiomas) pueden ser creados con asignado por defecto var y = 2; // dene la variable y y le
una sintaxis abreviada. De hecho, estos literales for- asigna el valor 2 a ella
man la base del formato de datos JSON.
Expresiones regulares JavaScript tambin es compatible con expresiones regulares de una manera similar a Perl, que proporcionan una sintaxis concisa y
poderosa para la manipulacin de texto que es ms
sosticado que las funciones incorporadas a los objetos de tipo string.[26]

A considerar los comentarios en el ejemplo de arriba, los


cuales van precedidos con 2 barras diagonales.
No existen funcionalidades para I/O incluidas en el
lenguaje; el entorno de ejecucin ya lo proporciona.
La especicacin ECMAScript en su edicin 5.1 hace
mencin:[31]

4 USO EN PGINAS WEB


... en efecto, no existen provisiones en esta
especicacin para entrada de datos externos o
salida para resultados computados.

Sin embargo, la mayora de los entornos de ejecucin tiene un objeto[32] llamado console que puede ser usado para
imprimir por el ujo de salida de la consola de depuracin. He aqu un simple programa que imprime Hello
world!:
console.log(Hello world!");
Una funcin recursiva:
function factorial(n) { if (n === 0) { return 1; } return n
* factorial(n - 1); }
Ejemplos de funcin annima (o funcin lambda) y una
clausura:
var displayClosure = function() { var count = 0; return
function () { return ++count; }; } var inc = displayClosure(); inc(); // devuelve 1 inc(); // devuelve 2 inc(); //
devuelve 3
Las expresiones con invocacin automtica permiten a las
funciones pasarle variables por parmetro dentro de sus
propias clausuras.

'gcd' === gcd, this['gcd'] === this.gcd this['gcd'] =


function () { return a; }; return a; }, // Los nombres de
las propiedades del objeto pueden ser especicados con
cadenas delimitadas con comillas simples (') o dobles ().
lcm : function () { // Los nombres de las variables no
colisionan con las propiedades del objeto. Por ejemplo:
|lcm| no es |this.lcm|. // No usar |this.a * this.b| para evitar
problemas con clculos en coma otante. var lcm = this.a
/ this.gcd() * this.b; // Slo necesitamos calcular MCM
una vez, por lo tanto redenimos este mtodo. this.lcm
= function () { return lcm; }; return lcm; }, toString: function () { return LCMCalculator: a = " + this.a + ", b = "
+ this.b; } }; // Denimos una funcin genrica para imprimir un resultado; esta implementacin solo funciona
en los navegadores web function output(x) { document.body.appendChild(document.createTextNode(x));
document.body.appendChild(document.createElement('br'));
} // Nota: Los mtodos.map() y.forEach() del prototipo
Array estn denidos en JavaScript 1.6. // Estos mtodos
son usados aqu para demostrar la naturaleza funcional
inherente del lenguaje. [[25, 55], [21, 56], [22, 58],
[28, 56]].map(function (pair) { // contruccin literal
de un Array + funcin de mapeo. return new LCMCalculator(pair[0], pair[1]); }).sort(function (a, b) { //
ordenamos la coleccin por medio de esta funcin return
a.lcm() - b.lcm(); }).forEach(function (obj) { output(obj
+ ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm()); });

var v; v = 1; var getValue = (function(v) { return El siguiente ejemplo muestra la salida que debera ser
function() {return v;}; }(v)); v = 2; getValue(); // 1
mostrada en la ventana de un navegador.

3.2

Ejemplos ms avanzados

LCMCalculator: a = 28, b = 56, gcd = 28, lcm =


56 LCMCalculator: a = 21, b = 56, gcd = 7, lcm
= 168 LCMCalculator: a = 25, b = 55, gcd = 5, lcm
= 275 LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

El siguiente cdigo muestra varias caractersticas de JavaScript.


/* Busca el mnimo comn mltiplo (MCM) de dos
nmeros */ function LCMCalculator(x, y) { // funcin
constructora var checkInt = function (x) { // funcin
interior if (x % 1 !== 0) { throw new TypeError(x +
" no es un entero); // lanza una excepcin } return x;
}; this.a = checkInt(x) // puntos y coma son opcionales
this.b = checkInt(y); } // El prototipo de las instancias de
objeto creados por el constructor es el de la propiedad
prototype del constructor. LCMCalculator.prototype =
{ // objeto denido como literal constructor: LCMCalculator, // cuando reasignamos un prototipo, establecemos
correctamente su propiedad constructor gcd: function
() { // mtodo que calcula el mximo comn divisor //
Algoritmo de Euclides: var a = Math.abs(this.a), b =
Math.abs(this.b), t; if (a < b) { // intercambiamos variables t = b; b = a; a = t; } while (b !== 0) { t = b; b = a %
b; a = t; } // Solo necesitamos calcular el MCD una vez,
por lo tanto 'redenimos este mtodo. // (Realmente no
es una redenicinest denida en la propia instancia,
por lo tanto // this.gcd se reere a esta 'redenicin'
en vez de a LCMCalculator.prototype.gcd). // Adems,

4 Uso en pginas web


El uso ms comn de JavaScript es escribir funciones
embebidas o incluidas en pginas HTML y que interactan con el Document Object Model (DOM o Modelo de
Objetos del Documento) de la pgina. Algunos ejemplos
sencillos de este uso son:
Cargar nuevo contenido para la pgina o enviar datos al servidor a travs de AJAX sin necesidad de recargar la pgina (por ejemplo, una red social puede
permitir al usuario enviar actualizaciones de estado
sin salir de la pgina).
Animacin de los elementos de pgina, hacerlos
desaparecer, cambiar su tamao, moverlos, etc.
Contenido interactivo, por ejemplo, juegos y reproduccin de audio y vdeo.

4.1

Ejemplo de script

Validacin de los valores de entrada de un formula- 4.1 Ejemplo de script


rio web para asegurarse de que son aceptables antes
A continuacin se muestra un breve ejemplo de una
de ser enviado al servidor.
pgina web (ajustadose a las normas del estndar para
Transmisin de informacin sobre los hbitos de HTML5) que utiliza JavaScript para el manejo del DOM:
lectura de los usuarios y las actividades de nave<!DOCTYPE html> <html> <head> <meta
gacin a varios sitios web. Las pginas Web con
charset="utf-8"> <title>Ejemplo sencillo</title> <h1
frecuencia lo hacen para hacer anlisis web, seguiid="header">Esto es JavaScript</h1> <script> documiento de anuncios, la personalizacin o para otros
ment.body.appendChild(document.createTextNode('Hola
nes.[33]
Mundo!'));
var
h1
=
document.getElementById('header');
//
contieDado que el cdigo JavaScript puede ejecutarse local- ne la referencia al tag <h1> h1 = documente en el navegador del usuario (en lugar de en un ment.getElementsByTagName('h1')[0]; // accediendo
servidor remoto), el navegador puede responder a las ac- al mismo elemento <h1> </script> <noscript>Tu
ciones del usuario con rapidez, haciendo una aplicacin navegador o no admite JavaScript, o JavaScript est desms sensible. Por otra parte, el cdigo JavaScript puede habilitado. </noscript> </head> <body>/*...*/</body>
detectar acciones de los usuarios que HTML por s sola </html>
no puede, como pulsaciones de teclado. Las aplicaciones
como Gmail se aprovechan de esto: la mayor parte de la
lgica de la interfaz de usuario est escrita en JavaScript,
enviando peticiones al servidor (por ejemplo, el conteni- 4.2 Consideraciones acerca de la compatido de un mensaje de correo electrnico). La tendencia
bilidad
cada vez mayor por el uso de la programacin Ajax exDebido a que JavaScript se ejecuta en entornos muy vaplota de manera similar esta tcnica.
riados, una parte importante de las pruebas y la depuraUn motor de JavaScript (tambin conocido como intrcin es probar y vericar que el cdigo JavaScript funcioprete de JavaScript o implementacin JavaScript) es un
na correctamente en mltiples navegadores. La interfaz
intrprete que interpreta el cdigo fuente de JavaScript y
DOM para acceder y manipular pginas web no es parejecuta la secuencia de comandos en consecuencia. El prite del estndar ECMAScript, o de la propia JavaScript.
mer motor de JavaScript fue creado por Brendan Eich en
El DOM es denido por los esfuerzos de estandarizacin
Netscape Communications Corporation, para el navegadel W3C, una organizacin independiente. En la prctica,
dor web Netscape Navigator. El motor, denominado Spilas implementaciones que hacen de JavaScript los distinderMonkey, est implementado en C. Desde entonces, ha
tos navegadores dieren tanto entre ellos mismos como
sido actualizado (en JavaScript 1.5) para cumplir con el
de las normas del estndar.
ECMA-262 edicin 3. El motor Rhino, creado principalmente por Norris Boyd (antes de Netscape, ahora en Goo- Para hacer frente a estas diferencias, los autores de JavaSgle) es una implementacin de JavaScript en Java. Rhino, cript pudieron ser capaces de escribir cdigo compatible
como SpiderMonkey, es compatible con el ECMA-262 con los estndares que tambin fuera capaz de ejecutarse
correctamente en la mayora de los navegadores, o en su
edicin 3.
defecto, que al menos se pudiera escribir cdigo capaz
Un navegador web es, con mucho, el entorno de acogida
de comprobar la presencia de ciertas funcionalidades del
ms comn para JavaScript. Los navegadores web suenavegador y que se comportase de manera diferente si no
len crear objetos no nativos, dependientes del entorno de
se dispusiese de dicha funcionalidad.[35] Existen casos en
ejecucin, para representar el Document Object Model
los que dos navegadores pueden llegar a implementar la
(DOM) en JavaScript. El servidor web es otro entorno
misma caracterstica, pero con un comportamiento difecomn de servicios. Un servidor web JavaScript suele
rente, hecho que a los programadores les puede resultar
exponer sus propios objetos para representar objetos de
de ayuda para detectar qu navegador se est ejecutando
peticin y respuesta HTTP, que un programa JavaScript
en ese instante y as cambiar el comportamiento de su espodra entonces interrogar y manipular para generar dicritura para que coincida.[36][37] Los programadores tamnmicamente pginas web.
bin suelen utilizar bibliotecas o herramientas que tengan
Debido a que JavaScript es el nico lenguaje por el que en cuenta las diferencias entre navegadores.
los ms populares navegadores comparten su apoyo, se
Adems, los scripts pueden no funcionar para algunos
ha convertido en un lenguaje al que muchos frameworks
usuarios. Por ejemplo, un usuario puede:
en otros lenguajes compilan, a pesar de que JavaScript
[34]
A pesar de las
no fue diseado para tales propsitos.
utilizar un navegador antiguo sin compatibilidad
limitaciones de rendimiento inherentes a su naturaleza
completa con la API DOM,
dinmica, el aumento de la velocidad de los motores de
utilizar un navegador PDA o telfono mvil que no
JavaScript ha hecho de este lenguaje un entorno para la
puede ejecutar JavaScript
compilacin sorprendentemente factible.

5 SEGURIDAD
tener la ejecucin de JavaScript deshabilitada, como
precaucin de seguridad,

5 Seguridad

utilizar un navegador de voz debido a, por ejemplo, JavaScript y el DOM permite que existan programadores que hagan un uso inapropiado para introducir scripts
una discapacidad visual.
que ejecuten cdigo con contenido malicioso sin el consentimiento del usuario y que pueda as comprometer su
Para apoyar a estos usuarios, los programadores web sue- seguridad.
len crear pginas que sean tolerante a fallos segn el agente de usuario (tipo de navegador) que no admita JavaS- Los desarrolladores de los navegadores tienen en cuenta
cript. En particular, la pgina debe seguir siendo til aun- este riesgo utilizando dos restricciones. En primer lugar,
que sin las caractersticas adicionales que JavaScript ha- los scripts se ejecutan en un sandbox en el que slo se
bra aadido. Un enfoque alternativo que muchos encuen- pueden llevar a cabo acciones relacionadas con la web, no
tran preferible es primero crear contenido utilizando las con tareas de programacin de propsito general, como la
tecnologas que funcionan en todos los navegadores, y creacin de archivos. En segundo lugar, est limitada por
mejorar el contenido para los usuarios que han permitido la poltica del mismo origen: los scripts de un sitio web
no tienen acceso a la informacin enviada a otro sitio web
JavaScript.
(de otro dominio) como pudiera ser nombres de usuario,
contraseas o cookies. La mayora de los fallos de seguridad de JavaScript estn relacionados con violaciones de
4.3 Accesibilidad
cualquiera de estas dos restricciones.
Suponiendo que el usuario no haya desactivado la ejecu- Existen proyectos como AdSafe o Secure ECMA script
cin de cdigo JavaScript, en el lado del cliente JavaS- (SES) que proporcionan mayores niveles de seguridad, en
cript debe ser escrito tanto con el propsito de mejorar especial en el cdigo creado por terceros (tales como los
las experiencias de los visitantes con discapacidad visual anuncios).[40][41]
o fsica, como el de evitar ocultar informacin a estos
La Poltica de Contenido Seguro (CSP) es el mtodo
visitantes.[38]
principal previsto para garantizar que slo cdigo de conLos lectores de pantalla, utilizados por los ciegos y de- anza pueda ser ejecutado en una pgina web.
cientes visuales, pueden ser tenidos en cuenta por JavaScript y as poder acceder y leer los elementos DOM de
la pgina. El cdigo HTML escrito debe ser lo ms con- 5.1 Vulnerabilidades cross-site
ciso, navegable y semnticamente rico posible, tanto si
JavaScript se ejecuta como si no.
Un problema comn de seguridad en JavaScript es el
JavaScript no debera de ser totalmente dependiente de
los eventos de ratn del navegador y debera ser accesible para aquellos usuarios que no quieran hacer uso del
ratn (informtica) 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 mayora de los casos.[38]

cross-site scripting o XSS, una violacin de la poltica


de mismo origen. Las vulnerabilidades XSS permiten a
un atacante inyectar cdigo JavaScript en pginas web
visitadas por el usuario. Una de esas webs podra ser la
de un banco, pudiendo el atacante acceder a la aplicacin de banca con los privilegios de la vctima, lo que
podra revelar informacin secreta o transferir dinero sin
JavaScript no debe ser utilizado para crear confusin o la autorizacin de la vctima. Una solucin para las vulnerabilidades XSS es utilizar HTML escapar cuando la
desorientacin al usuario web. Por ejemplo, modicar o
desactivar la funcionalidad normal del navegador, como visualizacin de datos no conables.
cambiar la forma en que el botn de de navegar hacia atrs Algunos navegadores incluyen una proteccin parcial
o el evento de actualizacin se comportan, son prcticas contra los ataques XSS reejados (el atacante est en la
que generalmente son mejores evitar. Igualmente, desen- misma peticin web). El atacante proporciona una URL
cadenar eventos que el usuario puede no tener en cuenta incluyendo cdigo malicioso. Sin embargo, incluso los
reduce la sensacin de control del usuario y provoca cam- usuarios de los navegadores son vulnerables a otros ataques XSS, tales como aquellos en los que el cdigo malibios inesperados al contenido de la pgina.[39]
A menudo, el proceso de dotar a una pgina web com- cioso se almacena en una base de datos. Slo el correcto
pleja el mayor grado accesibilidad posible, se convierte diseo de las aplicaciones Web en la parte servidora pueen un problema no trivial donde muchos temas se aca- de prevenir totalmente XSS. Las vulnerabilidades XSS
de ejecucin por
ban llevando al debate y a la opinin, siendo necesario tambin pueden ocurrir debido a errores
[42]
los
desarrolladores
del
navegador.
el compromiso de todos hasta el nal. Sin embargo, los
agentes de usuario y las tecnologas de apoyo a personas
con discapacidad estn en constante evolucin y nuevas
directrices e informacin al respecto siguen publicndose
en la web.[38]

Otra vulnerabilidad es la falsicacin de peticin de sitio cruzado o CSRF. En CSRF, el cdigo del sitio web
atacante engaa al navegador de la vctima, permitiendo
al atacante realizar peticiones en nombre de la vctima,

7
haciendo imposible saber a la aplicacin de destino (por
ejemplo, la de un banco haciendo una transferencia de
dinero) saber si la peticin ha sido realizada voluntariamente por el usuario o por un ataque CSRF.

cias. Opera incluye un conjunto de herramientas llamado Dragony.[46] El Inspector Web de WebKit incluye un
depurador de JavaScript[47] utilizado en Safari, junto con
una versin modicada de Google Chrome.

El ataque funciona porque, si el sitio de destino hace uso


nicamente de las cookies para autenticar las solicitudes
de la vctima, las peticiones iniciadas por el cdigo del
atacante tendrn las mismas credenciales de acceso legtimo que las solicitudes iniciadas por el propio usuario.

Existen algunas herramientas de ayuda a la depuracin,


tambin 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 cdigo JaEn general, la solucin a CSRF consiste en introducir un vaScript para que este quede conforme con un conjunto
campo de formulario oculto cuyo valor se utilice para de normas y directrices y que aseguran su correcto funrealizar la autenticacin, y no slo por medio de las co- cionamiento y mantenibilidad.
okies, en solicitudes que puedan tener efectos duraderos.
La comprobacin de la cabecera HTTP referer tambin
7 Referencias
puede servir de ayuda.
Hijacking JavaScript es un tipo de ataque CSRF en el
que una etiqueta <script> en el sitio web del atacante explota una vulnerabilidad en la pgina del sitio de la vctima que le hace devolver informacin privada, en forma de
JSON o cdigo JavaScript. Las posibles soluciones son:

[1] Douglas Crockford on Functional JavaScript (2:49): "[JavaScript] es el lenguaje funcional ms popular del mundo.
JavaScript es y siempre ha sido, al menos desde [la versin] 1.2, un lenguaje de programacin funcional.
[2] RFC 4329

que se requiera un token de autenticacin en los parmetros de las peticiones POST y GET para aquellas peticiones que requieran devolver informacin
privada del usuario.
usar POST y nunca GET para solicitudes que devuelven informacin privada

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 implementacin 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 aplicacin web ir dirigido.[43]
Los depuradores web estn disponibles para Internet Explorer, Firefox, Safari, Google Chrome y Opera.[44]
Existen tres depuradores disponibles para Internet Explorer: Microsoft Visual Studio es el ms avanzado de los
tres, seguido de cerca por Microsoft Script Editor (un
componente de Microsoft Oce)[45] y, nalmente, Microsoft Script Debugger, que es mucho ms bsico que el
otro dos, aunque es gratuito. El IDE gratuito Microsoft
Visual Web Developer Express ofrece una versin limitada de la funcionalidad de depuracin de JavaScript en
el Microsoft Visual Studio. Internet Explorer ha incluido
herramientas de desarrollo desde la versin 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 tambin tiene integrada un consola de errores bsica, que registra y evala
JavaScript. Tambin registra errores de CSS y adverten-

[3] http://www.ecma-international.org/publications/files/
ECMA-ST/ECMA-262.pdf
[4] M. Domnguez-Dorado,. Todo Programacin. N 12.
Pgs. 48-51. Editorial Iberprensa(Madrid). DL M-136792004. Septiembre de 2005. Bases de datos en el cliente con
JavaScript DB.
[5] Lenguajes de programacin usados en Internet y la World
Wide Web (WWW) (castellano)
[6] .com/0596101996/jscript5-CHP-1 O'Reilly - Safari
Books Online - 0596101996 - JavaScript: The Denitive
Guide, 5 edicin (castellano)
[7] http://tsdr.uspto.gov/#caseNumber=75026640&
caseType=SERIAL_NO&searchType=statusSearch
[8] Marcas registradas de Oracle.
[9] About JavaScript (en ingls). Consultado el 29 de agosto de 2013. JavaScript is a trademark or registered trademark of Oracle in the U.S. and other countries.
[10] Netscape Comunicado de prensa (castellano)
[11] Chapter 2: Getting Started. Server-Side JavaScript Guide. Netscape Communications Corporation. 1998. Consultado el 25 de abril de 2012.
[12] Mike Morgan (1996). Chapter 6: Netscape Internet
Application Framework. Using Netscape LiveWire,
Special Edition. Que.
[13] Server-Side Javascript: Back With a Vengeance. Read
Write Web. 17 de diciembre de 2009. Consultado el 28 de
mayo de 2012.
[14] Nodes goal is to provide an easy way to build scalable
network programs. About Node.js. Joyent.

[15] JavaScript: The Worlds Most Misunderstood Programming Language. Crockford.com. Consultado el 19 de
mayo de 2009.
[16] Kris Kowal (1 de diciembre de 2009). CommonJS eort
sets JavaScript on path for world domination. Ars Technica. Cond Nast Publications. Consultado el 18 de abril
de 2010.
[17] Flanagan, 2006, p. 16.
[18] Flanagan, 2006, pp. 176178.

10 ENLACES EXTERNOS

[39] Creating Accessible JavaScript. WebAIM. Consultado


el 8 de junio de 2010.
[40] ADsafe - Making JavaScript Safe for Advertising
[41] Secure ECMA Script (SES)
[42] MozillaZine, Mozilla Cross-Site Scripting Vulnerability
Reported and Fixed
[43] Advanced Debugging With JavaScript. alistapart.com.
3 de febrero de 2009. Consultado el 28 de mayo de 2010.

[20] Flanagan, 2006, p. 141.

[44] The JavaScript Debugging Console. javascript.about.com. 28 de mayo de 2010. Consultado


el 28 de mayo de 2010.

[21] Inheritance and the prototype chain. Mozilla Developer


Network. Mozilla. Consultado el 6 de abril de 2013.

[45] JScript development in Microsoft Oce 11 (MS InfoPath


2003)

[22] Herman, David (2013). Eective Javascript. AddisonWesley. p. 83. ISBN 9780321812186.

[46] Opera DragonFly. Opera Software.

[19] Properties of the Function Object

[23] Haverbeke, Marjin (2011). Eloquent Javascript. No Starch


Press. pp. 9597. ISBN 9781593272821.
[24] Katz, Yehuda. Understanding Prototypes in JavaScript. Consultado el 6 de abril de 2013.
[25] Herman, David (2013). Eective Javascript. AddisonWesley. pp. 125127. ISBN 9780321812186.
[26] Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch
Press. pp. 139149. ISBN 978-1593272821.
[27] Robert Nyman, Getters And Setters With JavaScript
Code Samples And Demos, published 29 May 2009, accessed 2 January 2010.
[28] John Resig, JavaScript Getters and Setters, 18 July 2007,
accessed 2 January 2010
[29] MDN - About this Reference. Developer.mozilla.org.
31 de agosto de 2008. Consultado el 19 de mayo de 2009.
[30] var - JavaScript - MDN. The Mozilla Developer Network. Consultado el 22 de diciembre de 2012.
[31] ECMAScript Language Specication - ECMA-262 Edition 5.1. Ecma International. Consultado el 22 de diciembre de 2012.
[32] console. Mozilla Developer Network. Mozilla. Consultado el 6 de abril de 2013.
[33] JavaScript tracking - Piwik. Piwik. Consultado el 31 de
marzo de 2012.
[34] Hamilton, Naomi (31 de junio de 2008). The AZ of Programming Languages: JavaScript. computerworld.com.au.
[35] Peter-Paul Koch, Object detection
[36] Peter-Paul Koch, Mission Impossible - mouse position
[37] Peter-Paul Koch, Browser detect
[38] Flanagan, 2006, pp. 262263.

[47] Introducing Drosera - Surn' Safari. Webkit.org. 28 de


junio de 2006. Consultado el 19 de mayo de 2009.

8 Vase tambin
VBScript
AJAX
Aplicacin web
Document Object Model
JSON
HTML

9 Bibliografa
Flanagan, David; Ferguson, Paula (2002). JavaScript: The Denitive Guide (4. edicin). ISBN 0-59600048-0.

10 Enlaces externos
Mozilla Developer Center
slice( ) - O'Reilly Answers (en ingls)
Distincin entre variables locales y globales

11
11.1

Text and image sources, contributors, and licenses


Text

JavaScript Fuente: http://es.wikipedia.org/wiki/JavaScript?oldid=81943830 Colaboradores: Andre Engels, Moriel, ManuelGR, Robbot,


Sanbec, Zwobot, Comae, Dodo, Triku, Ascnder, Sms, Rsg, Tostadora, Murphy era un optimista, Aldodell, Atalatlae, Choan, Niqueco, Renabot, Boticario, RobotJcb, Airunp, JMPerez, Edub, Taichi, Rembiapo pohyiete (bot), RJacinto, Rufous~eswiki, Magister Mathematicae,
Dem, Viko~eswiki, RobotQuistnix, Alhen, Superzerocool, Chobot, Arevaloce, Mazhack, Yrbot, DerkeNuke, Seanver, BOT-Superzerocool,
FlaBot, Vitamine, BOTijo, YurikBot, Icvav, Zam, Beto29, KnightRider, The Photographer, Jesuja, Txo, Isra00, Maldoror, Hoblap, Haitike, Zanaqo, Siabef, Paintman, Jorgechp, Faelomx, Bufalo 1973, BOTpolicia, l, CEM-bot, Jota.ele.ene, Laura Fiorucci, Marc-Andr
Abrock, Ignacio Icke, Especiales, Roberpl, Rosarinagazo, Antur, Thijs!bot, Jmacoe, uo Martnez, JoaquinFerrero, Gotrek~eswiki, Locovich, Isha, Mpeinadopa, JAnDbot, Spa karmona, Rubelodi, Mansoncc, Jaime Garca Mars, Don Depresor, Muro de Aguas, TXiKiBoT,
Luis junco, Almohada2, ColdWind, Humberto, Willmont, Rei-bot, Fixertool, Behemot leviatan, Pedro Nonualco, Chabbot, Idioma-bot,
Demimismo, Plux, Snakefang, JMd, Biasoli, TottyBot, Bucephala, Calvia, Cinevoro, VolkovBot, Technopat, Queninosta, Matdrodes, Elabra sanchez, Mjcuevas, Synthebot, BlackBeast, Shooke, Lucien leGrey, Vatelys, Mytwm, Muro Bot, SieBot, PaintBot, Loveless, Carmin,
Obelix83, Drinibot, Bigsus-bot, BOTarate, Tolitose, Inuyasha1111, Manw, El bot de la dieta, Tirithel, Amischol, Jmmuguerza, HUB,
Tosin2627, Eduardosalg, Botelln, Leonpolanco, Poco a poco, Osado, Efsandino, Camilo, UA31, Lockalbot, AVBOT, LucienBOT, MastiBot, MarcoAurelio, Ezarate, Enramos, Diegusjaimes, CarsracBot, Arjuno3, Luckas-bot, Nallimbot, Roinpa, FariBOT, Jotterbot, Bucle,
AlexandroRR, SuperBraulio13, Ortisa, Manuelt15, Xqbot, Jkbw, Maximilianomilicich, Rubinbot, FrescoBot, Kismalac, Igna, Adryitan,
Botarel, Amgc56, D'ohBot, TobeBot, RedBot, Rameshngbot, Vubo, DixonDBot, Abece, Fitoschido, Marjuanm, PatruBOT, JjedMoriAnktah, Alph Bot, KSEltar, Waeswaes, Jorge c2010, Foundling, EmausBot, Ojoavisor, Sergio Andres Segovia, Grillitus, JackieBot, Hoo man,
Rubpe19, ChuispastonBot, Oxes, DRAKCMEZA, Movses-bot, Viferico, AStarBot, UAwiki, Invadibot, Cinet uv, Conopo, Jr JL, MaKiNeoH, Legobot, Makore2, Denisvacamonar, Coins, Timohap, Ineditable, Jarould, Matiia, BenjaBot, Luisgarciaweb, Sony Xperia Z, Karem
uttaleb, Ehhhmaincraa y Annimos: 405

11.2

Images

11.3

Content license

Creative Commons Attribution-Share Alike 3.0

Potrebbero piacerti anche