O JavaScript tornou-se a linguagem nativa da Web. Dá vida às interfaces, reage às ações dos utilizadores, comunica com servidores e executa aplicações completas no navegador. Com Node.js chegou também aos servidores e às ferramentas de desenvolvimento. Em 1995, nada disto estava previsto a esta escala.
A sua história não é, portanto, a execução de um plano perfeito. É a história de uma linguagem nascida sob pressão, tornada indispensável pela distribuição universal e continuamente melhorada sem poder simplesmente abandonar o seu passado.
1995: tornar o navegador programável
No início da década de 1990, a Web era sobretudo documental. O HTML descrevia o conteúdo, o HTTP transportava recursos e o navegador apresentava a página. Para obter um novo resultado era normalmente necessário voltar a contactar o servidor.
A Netscape percebeu que o navegador podia tornar-se uma plataforma de aplicações. Queria uma linguagem leve que os autores pudessem inserir diretamente nas páginas, em complemento de Java, então fortemente promovido pela Sun.
Brendan Eich entrou na Netscape em abril de 1995 e, em maio, construiu em cerca de dez dias o primeiro protótipo, Mocha. Os famosos «dez dias» referem-se a esse protótipo, não ao JavaScript moderno. Mocha passou a LiveScript e depois a JavaScript, no final de 1995.
O nome aproveitou a popularidade de Java, mas criou uma confusão duradoura. JavaScript não é um Java simplificado. A sua aparência lembra a família C, enquanto entre as influências profundas estão Scheme, pelas funções de primeira classe, e Self, pelos objetos baseados em protótipos.
Um modelo pouco habitual sob uma sintaxe familiar
Em JavaScript, as funções são valores: podem ser guardadas, passadas e devolvidas. Este modelo adapta-se particularmente bem a interfaces orientadas por eventos.
O modelo histórico de objetos baseia-se em protótipos. Os objetos podem delegar a procura de propriedades noutros objetos. A sintaxe moderna class oferece uma abstração familiar, mas continua assente neste mecanismo.
A tipagem dinâmica e as conversões implícitas facilitaram a escrita de pequenos scripts, mas também produziram peculiaridades conhecidas. Grande parte da evolução posterior consiste em melhorar a linguagem sem quebrar páginas que dependem de comportamentos antigos.
JavaScript não é o navegador
A linguagem e o ambiente Web são facilmente confundidos. No entanto, o DOM, os eventos, a rede e o armazenamento Web são API do navegador, não partes do núcleo ECMAScript.
Esta distinção tornou-se fundamental quando o JavaScript saiu do navegador: a mesma linguagem pode funcionar em ambientes diferentes, cada um com as suas próprias API.
Historicamente, o DOM foi ainda assim decisivo. Ao expor a página como uma estrutura programável, permitiu alterar texto, atributos, estilos e elementos depois do carregamento. O documento Web começou a transformar-se numa interface dinâmica.
A guerra dos navegadores e a necessidade de um padrão
A Microsoft introduziu JScript no Internet Explorer em 1996. Netscape e Microsoft disponibilizavam também API incompatíveis, obrigando os programadores a lidar com diferenças entre navegadores.
A Netscape submeteu então a linguagem à Ecma International. Em 1997 surgiu a primeira edição da ECMA-262, que definiu ECMAScript.
JavaScript continuou a ser o nome corrente; ECMAScript tornou-se a especificação normalizada. A normalização não eliminou imediatamente as diferenças entre navegadores, mas deu ao núcleo da linguagem uma referência independente de um único fabricante. ECMAScript 3, publicado em 1999, tornou-se durante anos a base do JavaScript amplamente utilizado.
A retrocompatibilidade torna-se uma regra da Web
A primeira guerra dos navegadores deixou API proprietárias, motores inconsistentes e muito código de contorno. Estabeleceu também uma restrição duradoura: a Web procura não quebrar conteúdos existentes.
typeof null, igualdade fraca, conversões implícitas e antigas regras de âmbito têm origens diferentes, mas um comportamento utilizado em larga escala torna-se difícil de alterar de forma incompatível. O JavaScript moderno tende, por isso, a acrescentar mecanismos melhores em vez de reescrever o passado.
ECMAScript 4: aprender a evoluir sem uma rutura
Nos anos 2000, ECMAScript 4 propôs uma transformação muito ambiciosa, incluindo classes mais formais, tipos opcionais e numerosas novas funcionalidades. Os participantes não chegaram a acordo sobre complexidade, compatibilidade e direção, e o projeto foi abandonado.
A experiência moldou o futuro. O JavaScript passou a evoluir sobretudo através de mudanças graduais e compatíveis. ECMAScript 5 chegou em 2009 com strict mode e melhorias importantes para objetos e arrays.
Ajax e jQuery: JavaScript alimenta aplicações Web
Em meados dos anos 2000, aplicações como Gmail e Google Maps mostraram que uma página podia comunicar com servidores em segundo plano e atualizar apenas parte da interface. Em 2005, o termo Ajax popularizou esta abordagem.
Os sites começaram a comportar-se como aplicações. JavaScript deixou de servir apenas para validações e efeitos e passou a gerir estado e interação.
As diferenças entre navegadores continuavam difíceis. A partir de 2006, jQuery ofereceu uma API mais uniforme para DOM, eventos e pedidos. O seu enorme sucesso refletia a fragmentação da plataforma da época. À medida que os navegadores convergiram para os padrões, parte desta camada de compatibilidade tornou-se menos necessária.
A corrida dos motores JavaScript
Aplicações mais complexas levaram os fabricantes a investir fortemente no desempenho. Em 2008, a Google apresentou o V8 com o Chrome. A concorrência com SpiderMonkey, JavaScriptCore e outros motores acelerou enormemente o JavaScript. A compilação just-in-time tornou viáveis aplicações muito maiores no navegador.
Node.js: sair do navegador
Em 2009, Ryan Dahl criou o Node.js em torno do V8. O JavaScript passou a poder ser utilizado de forma prática em servidores e ferramentas de linha de comandos, com um modelo de entrada/saída assíncrono adequado a software de rede.
Node.js transformou o ecossistema. As equipas puderam utilizar JavaScript no cliente e no servidor, npm cresceu até se tornar um enorme registo de pacotes e a linguagem espalhou-se pelos sistemas de build, testes e automatização.
ECMAScript 2015: modernizar sem recomeçar
ECMAScript 2015 (ES6) introduziu let, const, funções arrow, módulos, promises, geradores, sintaxe de classes e muitas outras funcionalidades.
As novidades não substituíram o JavaScript antigo: construíram uma camada moderna compatível com o código existente. Depois disso, ECMAScript adotou um ciclo anual, com propostas que amadurecem progressivamente no processo TC39.
Frameworks e TypeScript
Com o crescimento das aplicações, o desafio passou a ser a organização de grandes interfaces. Backbone, Angular, React, Vue, Svelte e outras ferramentas propuseram modelos diferentes para componentes, estado e renderização. Fazem parte do ecossistema construído sobre JavaScript, não do núcleo da linguagem.
Em 2012, a Microsoft apresentou TypeScript, que acrescenta sobretudo um sistema de tipos estáticos e é transformado em JavaScript para execução nos ambientes existentes. TypeScript não substitui JavaScript: depende dele.
Porque ganhou o JavaScript
A vantagem decisiva do JavaScript não foi a perfeição, mas a distribuição. Todos os principais navegadores incluíam um motor JavaScript sem exigir qualquer instalação adicional.
A disponibilidade universal criou um ciclo de reforço: mais utilizadores atraíram mais investimento em motores, padrões, ferramentas e bibliotecas. A capacidade de evoluir sem abandonar a antiga Web protegeu essa vantagem.
O JavaScript de 2026 é, por isso, uma plataforma coletiva. Brendan Eich criou o núcleo inicial, mas a linguagem moderna resulta do trabalho do TC39, das equipas dos motores, dos fabricantes de navegadores, dos criadores de ferramentas e de milhões de programadores.
Cronologia
- 1995: Mocha, LiveScript e JavaScript na Netscape.
- 1996: JScript no Internet Explorer; começa a normalização na Ecma.
- 1997: primeira edição da ECMA-262.
- 1999: ECMAScript 3.
- 2005: Ajax populariza aplicações Web assíncronas.
- 2006: surge jQuery.
- 2008: Chrome e V8 intensificam a corrida pelo desempenho.
- 2009: ECMAScript 5 e Node.js.
- 2012: apresentação do TypeScript.
- 2015: ECMAScript 2015 moderniza profundamente a linguagem.
- Desde 2016: ECMAScript evolui num ciclo anual.
Perguntas frequentes
JavaScript foi realmente criado em dez dias?
Brendan Eich construiu o primeiro protótipo em cerca de dez dias, em maio de 1995. A linguagem publicada e normalizada continuou depois a evoluir durante três décadas.
JavaScript e Java estão relacionados?
Têm nomes semelhantes e alguns elementos sintáticos em comum, mas são linguagens distintas. A associação do nome JavaScript a Java foi sobretudo uma decisão comercial.
Qual é a diferença entre JavaScript e ECMAScript?
ECMAScript é a especificação padrão do núcleo da linguagem. JavaScript é o nome histórico e corrente das suas implementações.
O DOM faz parte de JavaScript?
Não. O DOM é uma API fornecida pelo ambiente Web. Outros ambientes JavaScript, como Node.js, disponibilizam API diferentes.
Porque conserva JavaScript comportamentos antigos?
Porque alterá-los de forma incompatível poderia quebrar enormes quantidades de páginas existentes. A retrocompatibilidade é uma restrição central da sua evolução.