Java Script
Java Script
Foi originalmente implementada como parte dos navegadores web para que scripts
pudessem ser executados do lado do cliente e interagissem com o usuário sem a
necessidade deste script passar pelo servidor, controlando o navegador, realizando
comunicação assíncrona e alterando o conteúdo do documento exibido, porém os
mecanismos JavaScript agora estão incorporados em muitos outros tipos de software host,
incluindo em servidores e bancos de dados da Web e em programas que não são da Web,
como processadores de texto e PDF, e em tempo de execução ambientes que
disponibilizam JavaScript para escrever aplicativos móveis e de desktop, incluindo widgets
de área de trabalho.
História
Início no Netscape
Em 1993, o Centro Nacional de Aplicações de Supercomputação (NCSA), uma unidade
da Universidade de Illinois em Urbana-Champaign, lançou o NCSA Mosaic, o primeiro
navegador gráfico popular da Web, que desempenhou um papel importante na expansão
do crescimento da nascente World Wide Web além do nicho NeXTSTEP onde a World
Wide Web havia se formado três anos antes. Em 1994, uma empresa chamada Mosaic
Communications foi fundada em Mountain View, na Califórnia, e empregou muitos dos
autores originais do NCSA Mosaic para criar o Mosaic Netscape. No entanto, não
compartilhou intencionalmente nenhum código com o NCSA Mosaic. O codinome interno
do navegador da empresa era Mozilla, uma junção de "Mosaic and Godzilla". A primeira
versão do navegador da Web, Mosaic Netscape 0.9, foi lançada no final de 1994. Em
quatro meses, já havia conquistado três quartos do mercado de navegadores e se tornado
o principal navegador da Web nos anos 90. Para evitar problemas de propriedade de
marca registrada com o NCSA, o navegador foi posteriormente renomeado para Netscape
Navigator no mesmo ano, e a empresa assumiu o nome de Netscape Communications. A
Netscape Communications percebeu que a Web precisava se tornar mais dinâmica. Marc
Andreessen, o fundador da empresa, acreditava que o HTML precisava de uma
"linguagem de cola" que fosse fácil de usar por Web designers e programadores de meio
período para montar componentes como imagens e plugins, onde o código poderia ser
escrito diretamente na Web.[9]
Embora tenha sido desenvolvido sob o nome Mocha, a linguagem foi oficialmente
chamada de LiveScript quando foi lançada em versões beta do Netscape Navigator 2.0 em
setembro de 1995, mas foi renomeada para JavaScript[12] quando foi lançada no Netscape
Navigator 2.0 beta 3 Dezembro.[13] A escolha final do nome causou confusão, dando a
impressão de que a linguagem era uma derivação da linguagem de programação Java, e a
escolha foi caracterizada como uma manobra de marketing da Netscape para dar ao
JavaScript o status da linguagem da moda, o Java.
Há um equívoco comum de que o JavaScript foi influenciado por uma linguagem de script
de página da Web desenvolvida pelo Nombas chamada Cmm (não confundir com o C
posteriormente - criado em 1997).[14] Brendan Eich, no entanto, nunca tinha ouvido falar de
Cmm antes de criar o LiveScript.[15] Os Nombas lançaram seus scripts de página da Web
incorporados no Netscape, embora o script de página da Web não fosse um conceito
novo, conforme mostrado pelo navegador da Web ViolaWWW. Nombas mais tarde passou
a oferecer JavaScript em vez de Cmm em seu produto ScriptEase e fazia parte do grupo
TC39 que padronizava o ECMAScript.[16]
JavaScript Back-end
Em dezembro de 1995, logo depois de lançar o JavaScript para navegadores, a Netscape
introduziu uma implementação da linguagem para scripting server-side com o Netscape
Enterprise Server.[17]
Padronização
Em novembro de 1996, a Netscape submeteu o JavaScript à ECMA International para criar
uma especificação padrão, que outros fornecedores de navegador poderiam implementar
com base no trabalho feito na Netscape. Isso levou ao lançamento oficial da especificação
de linguagem ECMAScript publicada na primeira edição da norma ECMA-262 em junho de
1997, sendo o JavaScript a mais conhecida das
implementações. ActionScript e JScript eram outras implementações bem conhecidas
do ECMAScript.
Com o tempo, ficou claro que a Microsoft não tinha intenção de cooperar ou implementar o
JavaScript adequado no Internet Explorer, mesmo que eles não tivessem uma proposta
concorrente e tivessem uma implementação parcial (e divergente neste ponto) no lado do
servidor .NET. Então, em 2003, o trabalho original do ECMAScript 4 foi desativado.
O próximo grande evento foi em 2005, com dois grandes acontecimentos na história do
JavaScript. Primeiro, Brendan Eich e Mozilla juntaram-se novamente à Ecma International
como um membro sem fins lucrativos e começaram a trabalhar no ECMAScript
para XML (E4X), o padrão ECMA-357, que veio de ex-funcionários da Microsoft na BEA
Systems (originalmente adquirida como Crossgain) . Isso levou a trabalhar em conjunto
com a Macromedia (posteriormente adquirida pela Adobe Systems), que estava
implementando o E4X no ActionScript 3 (o ActionScript 3 era um fork do ECMAScript 4
original).
Em junho de 2011, o ECMAScript 5.1 foi lançado para se alinhar totalmente com a terceira
edição do padrão internacional ISO / IEC 16262. O ECMAScript 2015 foi lançado em junho
de 2015. O ECMAScript 2016 foi lançado em junho de 2016. A versão atual é o
ECMAScript 2017, lançado em junho de 2017.
Desenvolvimentos posteriores
JavaScript tornou-se uma das linguagens de programação mais populares da web. No
entanto, muitos programadores profissionais inicialmente desacreditaram a linguagem
devido ao público-alvo percebido de autores da Web e outros "amadores".[22] O advento
do Ajax devolveu o JavaScript aos holofotes e atraiu mais atenção da programação
profissional. O resultado foi a proliferação de estruturas e bibliotecas abrangentes, práticas
de programação JavaScript aprimoradas e aumento do uso de JavaScript fora dos
navegadores da Web, conforme observado pela proliferação de plataformas JavaScript
do lado do servidor.
Em janeiro de 2009, o projeto CommonJS foi fundado com o objetivo de especificar uma
biblioteca padrão comum principalmente para o desenvolvimento de JavaScript fora do
navegador.[23]
Com o surgimento de aplicativos de página única e sites pesados em JavaScript, ele está
sendo cada vez mais usado como um alvo de compilação para compiladores de origem
para origem de linguagens dinâmicas e estáticas.
Marca comercial
"JavaScript" é uma marca comercial da Oracle Corporation nos Estados Unidos.[24] Ele é
usado sob licença para tecnologia inventada e implementada pela Netscape
Communications e entidades atuais, como a Fundação Mozilla.[25]
Características
As seguintes características são comuns a todas as implementações em conformidade
com o ECMAScript, a menos que esteja explicitamente especificado ao contrário.
Suporte universal
Todos os navegadores da Web modernos e populares suportam JavaScript com
interpretadores integrados.
Imperativa e Estruturada
JavaScript suporta os elementos de sintaxe de programação estruturada da linguagem C
como, por exemplo, if , while , switch . Uma exceção é a questão do escopo: o escopo
em blocos ao estilo do C não é suportado. Em seu lugar, JavaScript utiliza escopo a nível
de função. JavaScript 1.7, entretanto, suporta escopo a nível de bloco através do
comando let . Como C, JavaScript faz distinção entre expressões e comandos. Uma
diferença sintática do C é que a quebra de linha termina automaticamente o comando,
sendo o ponto-e-vírgula opcional ao fim de uma instrução.
Dinâmica
Tipagem dinâmica
Como na maioria das linguagens de script, tipos são associados com valores, não com
variáveis. Por exemplo, a variável x poderia ser associada a um número e mais tarde
associada a uma ''string''. JavaScript suporta várias formas de testar o tipo de um objeto,
incluindo duck typing.
Baseada em objetos
JavaScript é quase inteiramente baseada em objetos[carece de fontes]. Objetos JavaScript
são arrays associativos, aumentados com protótipos. Os nomes da propriedade de um
objeto são strings: obj.x = 10 e obj["x"] = 10 são equivalentes, o ponto neste
exemplo é apenas sintático. Propriedades e seus valores podem ser adicionadas,
mudadas, ou deletadas em tempo de execução. A maioria das propriedades de um objeto
(e aqueles em sua cadeia de herança via protótipo) pode ser enumerada usando-se uma
estrutura de repetição for...in . JavaScript possui um pequeno número de objetos
padrão da linguagem como window e document.
Funcional
Funções de primeira classe
No JavaScript, as funções são de primeira classe, isto é, são objetos que possuem
propriedades e métodos, e podem ser passados como argumentos, serem atribuídos a
variáveis ou retornados como qualquer outro objeto.
Funções aninhadas
Funções 'internas' ou 'aninhadas' são funções definidas dentro de outras funções. São
criadas cada vez que a função que as contém (externa) é invocada. Além disso, o escopo
da função externa, incluindo constantes, variáveis locais e valores de argumento, se
transforma parte do estado interno de cada objeto criado a partir da função interna, mesmo
depois que a execução da função interna é concluída.
Fechamentos
JavaScript permite que funções aninhadas sejam criadas com o escopo léxico no
momento de sua definição e possui o operador () para invocá-las em outro momento.
Essa combinação de código que pode ser executado fora do escopo no qual foi definido,
com seu próprio escopo durante a execução, é denominada, dentro da ciência da
computação, fechamento.
Baseada em Protótipos
Protótipos
JavaScript usa protótipos em vez de classes para o mecanismo de herança. É possível
simular muitas características de orientação a objetos baseada em classes com protótipos.
function calcIdade(b) {
var hoje = new Date();
var a = hoje.getFullYear();
var idade = a - b;
return idade;
}
Funções e métodos
Diferente de muitas linguagens orientadas a objetos, não há distinção entre a definição de
uma função e a definição de um método no JavaScript. A distinção ocorre durante a
chamada da função; a função pode ser chamada como um método. Quando uma função é
chamada como método de um objeto, a keyword this da função é associada àquele
objeto via tal invocação.
abrir uma nova janela (dialog) com controle programático sobre seu tamanho,
posição e atributos;
validar valores de um formulário para garantir que são aceitáveis antes de
serem enviados ao servidor;
mudar imagens à medida que o mouse se movimenta sobre elas.
Um recurso de interface útil baseada em janela, é um tipo de janela secundária da tela
principal, ou janela principal, para solicitar ou exibir ao usuário determinadas informações
complementares, semelhante a “caixa de diálogo” (dialog).
Existem dois tipos de associação entre uma janela de diálogo e a janela principal à qual
está associada: "forma modal" (showModalDialog), quando a abertura da janela de diálogo
flexível sobreposta a janela principal sem a necessidade de recarregar a página principal
após o uso do modal, chamada de Lightbox, bloqueando a interação com a janela principal
e esmaecendo/escurecendo o fundo até que o dialog seja encerrado; ou "forma não
modal", em que pode haver interação concomitante nas duas janelas (principal e diálogo)
sem bloqueio da principal, O caso mais comum é do dialog modal.[29][30]
Pelo fato do código JavaScript rodar localmente no navegador do usuário, e não em um
servidor remoto, o navegador pode responder a tais ações rapidamente, fazendo uma
aplicação mais responsiva. Além disso, o código JavaScript pode detectar ações de
usuário que o HTML sozinho não pode, tais como teclas pressionadas individualmente.
Aplicações como Gmail tomam vantagem disso: muito da lógica da interface do usuário é
escrita em JavaScript, e o JavaScript envia requisições de informação, tais como o
conteúdo de um correio eletrônico, para o servidor. A tendência mais ampla de
programação em Ajax explora de maneira similar este ponto forte. Uma JavaScript engine
(também conhecida como interpretador JavaScript ou uma implementação JavaScript)
interpreta código fonte JavaScript e o executa de forma adequada. A primeira
implementação JavaScript foi criada por Brendan Eich na Netscape Communications
Corporation, para o Navegador Netscape. A implementação, nomeada SpiderMonkey, é
implementada em C e vem sendo atualizada para conformar com a edição 3 do ECMA-
262. A implementação Rhino, criada primariamente por Norris Boyd (ex-empregado da
Netscape; agora no Google) é uma implementação de JavaScript em Java. Rhino,
como SpiderMonkey, é conformante com a terceira edição do ECMA-262.
Por ser o JavaScript a única linguagem que a maioria dos navegadores populares
suportam, tem se tornado uma linguagem alvo para muitos frameworks em outras
linguagens, a despeito do fato de não ter sido planejado para tal. Não obstante as
limitações de desempenho inerente à sua natureza dinâmica, a crescente velocidade das
implementações JavaScript tem feito da mesma uma prática linguagem intermediária.
Exemplo
Um exemplo minimalista de uma página conforme os padrões web (utilizando a
sintaxe HTML5) que contém JavaScript pode ser representado pelo seguinte código:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<title>Wikipédia</title>
<script>
window.onload = function() {
document.getElementById("hello").addEventListener("click", function()
{
alert("Bem-vindo à Wikipédia!");
}, false);
};
</script>
</head>
<body>
<noscript>Seu navegador não suporta JavaScript ou ele está
desabilitado.</noscript>
<button id="hello">Dizer "Olá"</button>
</body>
</html>
No script acima, vimos que existe uma tag chamada <noscript>, ela está neste código
HTML porque é um meio de acessibilidade com o cliente, fazendo com que seu texto seja
renderizado pelo navegador quando o JavaScript estiver desativado.
Compatibilidade
Já que JavaScript roda em ambientes variáveis, uma parte importante do teste e
depuração de seu código consiste na verificação de compatibilidade entre navegadores.
As interfaces DOM para a manipulação de páginas web não são parte do padrão ECMA,
ou do próprio JavaScript. Oficialmente, são definidas por um esforço de padronização
da W3C; na prática, implementações de navegadores diferem do padrão de uma para as
outras, e nem todos navegadores executam JavaScript.
Para lidar com essas diferenças, programadores JavaScript com frequência tentam
escrever códigos que conformam com o padrão comum a maioria dos navegadores; não
sendo possível isso, tentam escrever de maneira ad-hoc um código que verifique a
presença de certos recursos e que se comporte de maneira adequada caso tais recursos
não estejam disponíveis. Em alguns casos, dois navegadores podem ambos
implementarem uma funcionalidade com comportamentos diferentes, e programadores
podem achar prático detectar qual navegador está rodando e mudar o comportamento de
seus scripts para se adequar a isso. Programadores podem também usar bibliotecas ou
ferramentas que abstraem tais diferenças entre navegadores.
Além disso, scripts podem não funcionar para alguns usuários. Por exemplo, um usuário
pode:
Acessibilidade
Assumindo que o usuário não tenha desabilitado sua execução, pode-se utilizar JavaScript
do lado cliente para melhorar a experiência de um usuário com deficiência física ou visual.
Leitores de tela utilizados por pessoas cegas ou com visão parcial podem detectar a
presença de JavaScript e dessa forma acessar e ler o DOM da página depois que seus
scripts foram executados. Nestes casos recomenda-se que o HTML seja o mais conciso,
navegável e rico semanticamente possível, tendo a página scripts ou não. Não se
recomenda que o código JavaScript de uma página seja totalmente dependente dos
eventos provenientes do mouse já que usuários que não conseguem ou optam por não
usar o mouse não estarão aptos a colher os benefícios de tal código. Da mesma forma,
embora hyperlinks e webforms possam ser navegados e operados do teclado, JavaScript
voltado para acessibilidade não deve requerer um teclado para acessar tais eventos.
JavaScript conta com eventos independentes do dispositivo de usuário tais
como onfocus e onchange que são mais recomendados na maioria dos casos.
Não se recomenda utilizar JavaScript de um jeito que seja confuso ou desorientador para
qualquer usuário da internet. Por exemplo, usar JavaScript para alterar ou desabilitar a
funcionalidade normal de um navegador, tal como mudar a forma com que o botão direito
ou o evento de atualização funcionam, deve ser evitado. Da mesma forma, eventos de
interrupção que o usuário pode não estar ciente reduzem a sensação de controle do
usuário, assim como scripts inesperados que mudam o conteúdo da página.
Frequentemente o processo de fazer páginas web complexas tão acessíveis quanto
possível se transforma em um problema não trivial, onde certas decisões são assunto de
debate e opinião. Entretanto, tecnologias assistivas estão constantemente evoluindo e
novas recomendações e informações relevantes vem sendo continuamente publicadas na
web.
Segurança
JavaScript e o DOM representam uma potencialidade para programadores maliciosos
escreverem scripts para rodarem em um cliente via web. Navegadores são projetados para
conter este risco de duas maneiras. A primeira é que scripts são rodados em
uma sandbox na qual só podem executar ações relacionadas à internet, não tarefas de
programação de propósito geral como criar arquivos. A segunda é que scripts são
limitados pela regra da mesma origem: scripts de um website não têm acesso a
informações como nomes de usuário, senhas ou cookies enviados de outro site. A maioria
dos bugs em JavaScript relacionados à segurança são brechas de uma das regras.
Vulnerabilidades inter-site
Um problema comum relacionado à segurança é a escrita de scripts inter-site, ou XSS,
uma violação da regra da mesma origem. Tais vulnerabilidades ocorrem quando um
atacante está apto a causar em um site alvo, como um site de banco, a inclusão de um
script malicioso na página web apresentada à vítima. O script neste exemplo pode então
acessar a aplicação do banco com privilégios da vítima, potencialmente revelando
informações secretas ou transferindo dinheiro sem a autorização da vítima.
Alguns navegadores incluem proteção parcial contra ataques XSS refletidos, no qual o
atacante fornece uma URL incluindo o script malicioso. No entanto, mesmo usuários
destes sites estão vulneráveis a outros ataques XSS, como aqueles onde o código
malicioso é guardado em um banco de dados. Apenas o correto desenho de aplicações
web no servidor pode prevenir inteiramente ataques XSS.
Vulnerabilidades XSS também podem ocorrer por causa de erros de implementação por
parte de programadores de navegadores.
"Sequestro JavaScript" é um tipo de ataque CSRF no qual uma tag <script> no site do
atacante explora uma página no lado da vítima que retorna informação privada tal
como JSON ou JavaScript. Soluções possíveis incluem requerer um token de autenticação
nos parâmetros POST e GET para qualquer resposta que retorne um JSON privado
(mesmo que não tenha efeitos colaterais); utilizar POST e nunca GET para requisições
que retornem um JSON privado; e modificar a resposta de forma que não possa ser usada
via uma tag <script> (através, por exemplo, de um wrapping de um JSON em um
comentário JavaScript).
No Windows Vista, a Microsoft tentou conter os riscos de erros, como estouro de buffer,
executando o processo do Internet Explorer com privilégios limitados.[36] O Google
Chrome confina seus renderizadores de página à sua própria "sandbox".
Vulnerabilidades de Hardware
Em 2015, uma implementação de prova de conceito baseada em JavaScript de um ataque
de desajustes foi descrita em um artigo por pesquisadores de segurança.[41][42][43]
Em 2017, foi demonstrado um ataque baseado em JavaScript via navegador que poderia
ignorar o ASLR. É chamado de "ASLR⊕Cache" ou AnC.[44][45]
Exemplos de scripts
Scripts Simples
// Mostra um alerta de Confirmar e Cancelar.
if ( confirm( 'Escolha "Ok" ou "Cancelar" para ver a mensagem
correspondente.' ) ) {
alert( 'Você apertou o botão "OK"' ); // mostra um alerta para
resposta "OK"
} else {
alert( 'Você apertou o botão "Cancelar"' ); // mostra um alerta para
resposta "Cancelar"
}
Comentários
JavaScript permite utilizar comentários de duas formas:
/* Já este comentário
é mais longo e utiliza
várias linhas */
Funções
Criando uma função simples:
return/*Valor retornado*/;
}
Hierarquia do objeto
//Construtor
//Construtor
function Exemplo() {
this.propriedade = 'Isso é uma propriedade.',
this.metodo = function() {
return 'Isso é um metódo';
}
}
Números Perfeitos
function perfectNumbers(max) {
var i, j, k,
perfects = [];
if (k === i) {
perfects.push(k);
}
}
Ferramentas de Desenvolvimento
Dentro do JavaScript, o acesso a um depurador se torna inestimável ao desenvolver
programas grandes e não triviais. Pode haver diferenças de implementação entre os vários
navegadores (especialmente dentro do DOM), portanto, é útil ter acesso a um depurador
para cada um dos navegadores que um aplicativo Web tem como destino.[46]
Versão
JavaScript foi inicialmente desenvolvido em 1996 para uso no navegador da
Web Netscape Navigator. No mesmo ano, a Microsoft lançou uma implementação para
o Internet Explorer. Essa implementação foi chamada de JScript devido a problemas de
marca registrada. Em 1997, a primeira versão padronizada da linguagem foi lançada sob o
nome ECMAScript na primeira edição da norma ECMA-262.