├── .gitignore
├── img
├── alert.png
├── bit-sea.png
├── confirm.png
├── cos_sin.jpg
├── eloq-js.jpg
├── eloq-js.png
├── mirror.png
├── object.jpg
├── octopus.jpg
├── prompt.png
├── darkblue.png
├── game_grid.png
├── html-tree.jpg
├── transform.png
├── unicycle.png
├── html-boxes.jpg
├── html-links.jpg
├── player_big.png
├── skillsharing.png
├── sprites_big.png
├── syntax_three.png
├── weresquirrel.png
├── controlflow_if.png
├── octopus-array.jpg
├── octopus-object.jpg
├── controlflow_loop.png
├── exercise_shapes.png
├── mysterious-computer.jpg
├── controlflow_nested_if.png
├── controlflow_straight.png
├── linked-list.svg
├── pizza-squirrel.svg
└── re_porcogalinhas.svg
├── .editorconfig
├── glossario.md
├── README.md
├── CONTRIBUTING.md
└── chapters
├── 00-introducao.md
├── 12-javascript-e-o-navegador.md
├── 01-valores-tipos-operadores.md
├── 08-erros-e-manipulacao-de-erros.md
├── 11-pratica-linguagem-de-programacao.md
├── 06-a-vida-secreta-dos-objetos.md
└── 10-modulos.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | *.swp
3 | *.swo
4 |
--------------------------------------------------------------------------------
/img/alert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/alert.png
--------------------------------------------------------------------------------
/img/bit-sea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/bit-sea.png
--------------------------------------------------------------------------------
/img/confirm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/confirm.png
--------------------------------------------------------------------------------
/img/cos_sin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/cos_sin.jpg
--------------------------------------------------------------------------------
/img/eloq-js.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/eloq-js.jpg
--------------------------------------------------------------------------------
/img/eloq-js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/eloq-js.png
--------------------------------------------------------------------------------
/img/mirror.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/mirror.png
--------------------------------------------------------------------------------
/img/object.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/object.jpg
--------------------------------------------------------------------------------
/img/octopus.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/octopus.jpg
--------------------------------------------------------------------------------
/img/prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/prompt.png
--------------------------------------------------------------------------------
/img/darkblue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/darkblue.png
--------------------------------------------------------------------------------
/img/game_grid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/game_grid.png
--------------------------------------------------------------------------------
/img/html-tree.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/html-tree.jpg
--------------------------------------------------------------------------------
/img/transform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/transform.png
--------------------------------------------------------------------------------
/img/unicycle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/unicycle.png
--------------------------------------------------------------------------------
/img/html-boxes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/html-boxes.jpg
--------------------------------------------------------------------------------
/img/html-links.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/html-links.jpg
--------------------------------------------------------------------------------
/img/player_big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/player_big.png
--------------------------------------------------------------------------------
/img/skillsharing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/skillsharing.png
--------------------------------------------------------------------------------
/img/sprites_big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/sprites_big.png
--------------------------------------------------------------------------------
/img/syntax_three.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/syntax_three.png
--------------------------------------------------------------------------------
/img/weresquirrel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/weresquirrel.png
--------------------------------------------------------------------------------
/img/controlflow_if.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/controlflow_if.png
--------------------------------------------------------------------------------
/img/octopus-array.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/octopus-array.jpg
--------------------------------------------------------------------------------
/img/octopus-object.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/octopus-object.jpg
--------------------------------------------------------------------------------
/img/controlflow_loop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/controlflow_loop.png
--------------------------------------------------------------------------------
/img/exercise_shapes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/exercise_shapes.png
--------------------------------------------------------------------------------
/img/mysterious-computer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/mysterious-computer.jpg
--------------------------------------------------------------------------------
/img/controlflow_nested_if.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/controlflow_nested_if.png
--------------------------------------------------------------------------------
/img/controlflow_straight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericdouglas/eloquente-javascript/HEAD/img/controlflow_straight.png
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 | [*]
3 | charset = utf-8
4 | end_of_line = lf
5 | insert_final_newline = false
6 | trim_trailing_whitespace = true
7 | indent_style = tab
8 | indent_size = 4
9 |
10 | [*.md]
11 | trim_trailing_whitespace = false
--------------------------------------------------------------------------------
/glossario.md:
--------------------------------------------------------------------------------
1 | # Glossário
2 | Essa página tem como objetivo reunir termos técnicos (ou não) e suas respectivas traduções para mantermos uma padrão uniforme nos capítulos. Esse é um documento orgânico que irá ser atualizado de forma colaborativa a medida que novos termos forem surgindo.
3 |
4 | # Traduções (Original - Tradução)
5 |
6 | * Debug - Debugar ([#155](https://github.com/braziljs/eloquente-javascript/issues/155))
7 | * Writable stream - Stream de escrita ([#115](https://github.com/braziljs/eloquente-javascript/issues/115))
8 | * Thread - Thread ([#98](https://github.com/braziljs/eloquente-javascript/issues/98))
9 | * Callback - Callback ([#97](https://github.com/braziljs/eloquente-javascript/issues/97))
10 | * Let’s get coding - Vamos codar ([#92](https://github.com/braziljs/eloquente-javascript/issues/92))
11 | * Body - Corpo
12 | * Client - Cliente
13 | * Encoded - Codificado
14 | * Prefetch - Pré-carregar
15 | * Query String - String de pesquisa
16 | * Resource - Recurso
17 | * Request - Request
18 | * Response - Resposta
19 | * String - String
20 | * URL Encoding - Codificação da URL
21 | * Array - Array
22 | * Wrapper - Wrapper ([#273](https://github.com/braziljs/eloquente-javascript/issues/273))
23 |
24 | ## Como contribuir?
25 | No arquivo [CONTRIBUTING.md](https://github.com/braziljs/eloquente-javascript/blob/master/CONTRIBUTING.md), há uma seção chamada **"Dúvidas em tradução de termos, palavras, expressões etc..."** explicando mais detalhes sobre como contribuir. Se você tem alguma sugestão para melhorar alguma tradução já feita, basta comentar na issue de referência sua sugestão que vamos discutir a proposta de alteração.
26 |
--------------------------------------------------------------------------------
/img/linked-list.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaScript Eloquente - 2ª edição
2 |
3 | **Uma moderna introdução ao JavaScript, programação e maravilhas digitais.**
4 |
5 | > **Mantenedor:** [Eric Douglas](https://github.com/ericdouglas)
6 |
7 | 
8 |
9 | ## Conteúdo do Livro
10 |
11 | [Introdução](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/00-introducao.md)
12 |
13 | 1. [Valores, Tipos e Operadores](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/01-valores-tipos-operadores.md) - (**Parte 1: Linguagem**)
14 | 1. [Estrutura do Programa](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/02-estrutura-do-programa.md)
15 | 1. [Funções](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/03-funcoes.md)
16 | 1. [Estrutura de Dados: Objeto e Array](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/04-estruturas-de-dados.md)
17 | 1. [Funções de Ordem Superior](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/05-funcoes-de-ordem-superior.md)
18 | 1. [A Vida Secreta dos Objetos](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/06-a-vida-secreta-dos-objetos.md)
19 | 1. [Prática: Vida Eletrônica](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/07-pratica-vida-eletronica.md)
20 | 1. [Erros e Manipulação de Erros](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/08-erros-e-manipulacao-de-erros.md)
21 | 1. [Expressões Regulares](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/09-expressoes-regulares.md)
22 | 1. [Módulos](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/10-modulos.md)
23 | 1. [Prática: A Linguagem de Programação](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/11-pratica-linguagem-de-programacao.md)
24 | 1. [JavaScript e o Navegador](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/12-javascript-e-o-navegador.md) - (**Parte 2: Navegador**)
25 | 1. [O *Document Object Model*](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/13-document-object-model.md)
26 | 1. [Manipulando Eventos](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/14-manipulando-eventos.md)
27 | 1. [Projeto: Plataforma de Jogo](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/15-projeto-plataforma-de-jogo.md)
28 | 1. [Desenhando no Canvas](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/16-desenhando-n0-canvas.md)
29 | 1. [HTTP](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/17-http.md)
30 | 1. [Formulários e Campos de Formulários](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/18-formularios-e-campos-de-formularios.md)
31 | 1. [Projeto: Um Programa de Pintura](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/19-projeto-um-programa-de-pintura.md)
32 | 1. [Node.js](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/20-nodejs.md) - (**Parte 3: Node.js**)
33 | 1. [Projeto: Website de Compartilhamento de Habilidades](https://github.com/braziljs/eloquente-javascript/blob/master/chapters/21-projeto-website-de-compartilhamento-de-habilidades.md)
34 |
35 | ## Como Contribuir
36 |
37 | Veja nosso guia de contribuição [aqui](https://github.com/braziljs/eloquente-javascript/blob/master/CONTRIBUTING.md).
38 |
39 | Confira também o glossário de termos técnicos em inglês e suas respectivas traduções [aqui](https://github.com/braziljs/eloquente-javascript/blob/master/glossario.md).
40 |
41 | ## Informações Importantes
42 |
43 | - Autor: **Marijn Haverbeke**
44 | - [Versão original](http://eloquentjavascript.net) deste livro.
45 |
46 | Licenciado sob a licença [Creative Commons attribution-noncommercial.](http://creativecommons.org/licenses/by-nc/3.0/).
47 |
48 | Todo código neste livro também pode ser considerado sob a [licença MIT](http://opensource.org/licenses/MIT).
49 |
--------------------------------------------------------------------------------
/img/pizza-squirrel.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contribuições
2 |
3 | ### Por onde começar?
4 |
5 | **1.** Faça o _fork_ do projeto.
6 |
7 | **2.** [Entenda nosso fluxo](#fluxo).
8 |
9 | **3.** [Leia e pratique as boas práticas](#boas-pr%C3%A1ticas).
10 |
11 | ### Fluxo
12 |
13 | É muito fácil contribuir para o projeto. Qualquer tipo de ajuda (seja ela grande ou pequena) é bem-vinda. Se encontrar qualquer parte do livro que possa ser melhorada, essa é uma grande oportunidade para participar ([aqui](https://github.com/braziljs/eloquente-javascript/issues?q=is%3Aopen+is%3Aissue+label%3Amelhorias) é um ótimo lugar para achar coisas que possam ser melhoradas). Caso não saiba por onde começar:
14 |
15 | **1.** Faça referência ao repositório oficial após o _fork_
16 |
17 | ```
18 | git remote add upstream git@github.com:braziljs/eloquente-javascript.git
19 | ```
20 |
21 | **2.** Antes de iniciar o processo de contribuição, crie uma nova branch para fazer suas alterações.
22 |
23 | Alguns exemplos:
24 |
25 | - Para tradução: `git checkout -b traducaoCapX`
26 | - Para revisões: `git checkout -b revisaoCapX`
27 | - Para erros: `git checkout -b correcaoCapX`
28 |
29 | > Use qualquer nome que seja coerente com a contribuição que está sendo feita.
30 | > `X` representa o número do capítulo.
31 |
32 | **3.** Após realizar as alterações, é hora de fazer um commit com uma mensagem coerente do que foi feito. Exemplo:
33 |
34 | ```
35 | git add --all
36 | git commit -am ‘Adiciona tradução/revisão/melhoria capítulo X linha/linhas Y’
37 | git push origin traducaoCapX
38 | ```
39 |
40 | **4.** Envie um _Pull Request_ com as alterações feitas, fazendo referência para o `master` do repositório oficial.
41 |
42 | **5.** Sua contribuição será analisada pela comunidade. Em alguns casos pediremos algumas alterações antes de dar merge.
43 |
44 | Após o merge:
45 |
46 | - Delete a branch utilizada:
47 |
48 | ```
49 | git checkout master
50 | git push origin :traducaoCapX
51 | git branch -D traducaoCapX
52 | ```
53 |
54 | - Atualize seu repositório com o repositório oficial:
55 |
56 | ```
57 | git fetch upstream
58 | git rebase upstream/master
59 | git push -f origin master
60 | ```
61 |
62 | **6.** Quando iniciar uma nova contribuição, inicie repita o processo pelo passo 2.
63 |
64 | ### Boas práticas
65 |
66 | - **Não traduza termos técnicos e blocos de código**
67 | - Antes de enviar sua contribuição, certifique-se de que está enviando apenas um **único** commit que represente o que foi feito. Caso tenha feito vários commits, [esmague-os](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) antes de fazer o _Pull Request_.
68 | - Caso tenha qualquer tipo de dúvida, abre uma _Issue_ que faremos o possível para te ajudar.
69 | - Não adicione comentários nas issues de “log”. Elas tem apenas a finalidade de armazenar referências ao trabalho de cada capítulo.
70 | - Contribua com as discussões.
71 | - Delimitação para títulos de obras: Utilizar o travessão (—) para o início da frase, nome do autor e logo após o nome da obra, sem alterar nenhum valor. Exemplo:
72 |
73 | > — Master Yuan-Ma, The Book of Programming
74 |
75 | - Estrangeirismo: Utilizar o formato itálico. Exemplo: _bug_
76 | - Sentido Figurado: Sempre destacar com aspas duplas.
77 | - Citação: Aspas duplas com o sinal de >. Exemplo:
78 |
79 | > “Foo bar”
80 |
81 | - Marcação para código: Utilizar um apóstrofe (\`) para indicar um pedaço de código no meio de um texto (`var foo = undefined`). Ou três apóstrofe com o nome da linguagem de programação na frente (\`\`\`js), para indicar um bloco de código:
82 |
83 | ```js
84 | var foo;
85 | foo = undefined;
86 | ```
87 |
88 | ### Dúvidas em tradução de termos, palavras, expressões etc…
89 |
90 | Quando estiver em uma situação em que você não sabe exatamente como traduzir uma palavra, termo ou expressão, nós recomendamos que siga os seguintes passos:
91 |
92 | **1.** Abra uma _Issue_ com um título descritivo como por exemplo: “_Como traduzir a palavra/termo “x”?_” e coloque uma descrição fazendo referência à linha e o capítulo que esteja trabalhando.
93 |
94 | **2.** Adicione uma tag `[TODO: ref #][/TODO]` e continue trabalhando no arquivo enquanto não há uma conclusão na _Issue_. Esse processo é importante para facilitar o acesso a itens pendentes e ter uma referência clara onde está ocorrendo a discussão.
95 |
96 | **3.** Após a conclusão da discussão na _Issue_, feche a mesma. Em seguida, remova a tag adicionada no passo 2 e atualize a palavra/termo não traduzido.
97 |
98 | **4.** Como mantemos um arquivo de [glossário](https://github.com/braziljs/eloquente-javascript/blob/master/glossario.md), faça um _Pull Request_ adicionando o novo termo, colocando a referência `#` no termo/palavra em questão para fácil acesso no futuro.
99 |
100 | ***
101 |
102 | Obrigado! :heart: :heart: :heart:
103 |
104 |
--------------------------------------------------------------------------------
/img/re_porcogalinhas.svg:
--------------------------------------------------------------------------------
1 |
2 |
381 |
--------------------------------------------------------------------------------
/chapters/00-introducao.md:
--------------------------------------------------------------------------------
1 | # Introdução
2 |
3 | Esse livro é sobre como fazer com que os computadores façam exatamente o que você quer que eles façam. Hoje em dia, os computadores são tão comuns quanto as chaves de fenda, mas possuem uma complexidade escondida que os torna mais difíceis de se operar e entender. Para muitos, eles continuam não sendo muito familiares e ameaçadores.
4 |
5 | 
6 |
7 | Nós encontramos duas maneiras efetivas para aproximar o espaço vazio que existe na comunicação entre nós, organismos biológicos com um talento para o raciocínio espacial e social, e os computadores, que não possuem sentimentos e são apenas manipuladores de dados. A primeira é baseada em usar nosso senso do mundo físico e construir interfaces que simulam esse mundo, permitindo manipular estruturas na tela com os nossos dedos. Isso funciona muito bem para interações casuais com a máquina.
8 |
9 | Entretanto, ainda não encontramos uma maneira boa de usar a abordagem de apontar e clicar para comunicar ao computador as coisas que o designer da interface não previu. Para interfaces mais gerais, como instruir o computador a executar tarefas arbitrárias, tivemos mais sorte com uma abordagem que utiliza nosso talento para linguagem: ensinar uma linguagem à maquina.
10 |
11 | As linguagens humanas possibilitam que palavras e frases sejam combinadas de diferentes maneiras, nos permitindo falar diferentes coisas. As linguagens do computador, normalmente menos flexíveis em sua gramática, seguem um princípio similar.
12 |
13 | A computação casual se tornou cada vez mais popular nos últimos vinte anos e as interfaces baseadas em linguagens, que era a forma na qual as pessoas interagiam com os computares, foram amplamente substituídas por interfaces gráficas. Mesmo assim, elas continuam por aí, basta saber onde procurá-las. Uma linguagem específica chamada JavaScript está presente em praticamente todos os navegadores e, por isso, está disponível em quase todos os aparelhos.
14 |
15 | Esse livro tem o objetivo de familiarizá-lo o suficiente com essa linguagem para que você seja capaz de fazer com que o computador faça o que você quiser.
16 |
17 | ## Sobre Programação
18 |
19 | > Eu não esclareço os que não estão prontos para aprender, nem desperto aqueles que não estão ansiosos para dar uma explicação a si próprios. Se eu apresentei um canto da praça, e eles não podem voltar para mim com os outros três, eu não deveria passar por estes pontos novamentes. **Confúcio**
20 |
21 | Antes de explicar JavaScript, eu também quero introduzir os princípios básicos de programação. Programação, ao que parece, é difícil. As regras fundamentais são claras e simples. Mas programas, criados em cima destas regras básicas, tendem a tornar-se complexos o suficiente para introduzir suas próprias regras e complexidades. Você está construindo seu próprio labirinto, e pode simplesmente perder-se nele.
22 |
23 | Para tirar algum proveito deste livro, mais do que apenas uma leitura passiva é necessário. Trate de ficar atento, faça um esforço para entender o exemplo de código, e somente continue quando você estiver razoavelmente seguro que você entendeu o material que veio antes.
24 |
25 | > O programador de computadores é um criador de universos no qual ele é o único responsável. Universos de complexidade virtualmente ilimitada podem ser criados sob a forma de programas de computador. **Joseph Weizenbaum, Computer Power and Human Reason**
26 |
27 | Um programa é muitas coisas. É um pedaço de texto digitado por um programador, que é a força direta que faz que o computador faça o que faz, são dados na memória do computador, mas ele controla as ações realizadas nesta mesma memória. Analogias que tentam comparar programas com objetos que somos familiares tendem a ser insuficientes. Uma conexão superficial é a com uma máquina - muitas partes separadas tendem a ser envolvidas, e para fazer o conjunto todo precisamos considerar as maneiras que estas partes se interconectam e contribuam para a operação do todo.
28 |
29 | Um computador é uma máquina feita para atuar como um hospedeiro para estas máquinas imateriais. Computadores por si próprios podem somente fazer coisas estúpidas e simples. A razão deles serem tão úteis é que eles fazem coisas em uma velocidade incrível. Um programa pode ingenuamente combinar enormes números de simples ações ao invés de fazer coisas complicadas.
30 |
31 | Para muitos de nós, escrever programas de computador é um fascinante jogo. Um programa é uma construção do pensamento. Não tem custos de construção, é leve e cresce facilmente ante nossas digitações.
32 |
33 | Se não formos cuidadosos, seu tamanho e complexidade vão aumentar fora de controle, confundindo até a pessoa que o criou. Este é o principal problema da programação: manter os programas sobre controle. Quando um programa funciona, ele é lindo. A arte de programar é a habilidade de controlar a complexidade. Um grande programa é suave, é simples em sua complexidade.
34 |
35 | Alguns programadores acreditam que esta complexidade é melhor gerenciada usando somente um pequeno conjunto de técnicas bem entendidas em seus programas. Eles compõe regras rígidas (*"boas práticas"*) prescrevendo a forma que programas devem ter, e os mais zelosos sobre isso vão considerar aqueles que saem desta pequena zona de segurança *maus programadores*.
36 |
37 | Quanta hostilidade perante a riqueza da programação - tentar reduzir a algo simples e previsível, colocando um tabu em todos os lindos e misteriosos programas! A paisagem das técnicas de programação é enorme, fascinante em sua diversidade, e permanece largamente inexplorada. É sem dúvida perigoso ir neste caminho, atraindo o programador inexperiente em todo tipo de confusão, mas isso só significa que você deve proceder com cautela e manter o juízo. Conforme você aprende, sempre haverá novos desafios e novos territórios a serem explorados. Programadores que recusam de manter-se explorando vão estagnar, esquecer sua alegria, e ficar entediado com seu trabalho.
38 |
39 | ## Porque linguagens importam?
40 |
41 | No começo, no nascimento da programação, não havia linguagens de programação. Programas pareciam algo desta forma:
42 |
43 | ```
44 | 00110001 00000000 00000000
45 | 00110001 00000001 00000001
46 | 00110011 00000001 00000010
47 | 01010001 00001011 00000010
48 | 00100010 00000010 00001000
49 | 01000011 00000001 00000000
50 | 01000001 00000001 00000001
51 | 00010000 00000010 00000000
52 | 01100010 00000000 00000000
53 | ```
54 |
55 | Este é um programa que soma os números do 1 ao 10 e imprimi o resultado (1 + 2 + ... 10 = 55). Isso pode rodar em uma máquina hipotética muito simples. Para programar os primeiros computadores, era necessário configurar grandes arrays de chaves na posição certa, ou fazer furos em cartões e alimentá-los no computador. Você pode imaginar como isso era tedioso, e um procedimento propenso ao erro. Mesmo escrever simples programas requeriam muita habilidade e disciplina. Os complexos eram quase inconcebíveis.
56 |
57 | Claro, inserindo manualmente estes padrões misteriosos de bits (1 e 0) fez que o programador tivesse uma profunda sensação de ser um poderoso feiticeiro. E isto tem que valer alguma coisa em termos de satisfação no trabalho.
58 |
59 | Cada linha do programa contém uma simples instrução. Isto pode ser escrito assim:
60 |
61 | ```
62 | 1. Guarde o número 0 na posição da memória 0.
63 | 2. Guarde o número 1 na posição da memória 1.
64 | 3. Guarde o valor da posição da memória 1 na posição da memória 2.
65 | 4. Subtraia o número 11 do valor na posição da memória 2.
66 | 5. Se o valor na posição da memória 2 é o número 0, continue com a instrução 9.
67 | 6. Adicione o valor da posição da memória 1 para posição de memória 0.
68 | 7. Adicione o número 1 ao valor da posição de memória 1.
69 | 8. Continue com a instrução 3.
70 | 9. Retorne o valor da posição da memória 0.
71 | ```
72 |
73 | Embora isto seja mais legível que a sopa de bits, ainda continua bastante desagradável. Pode ser de auxílio usar nomes ao invés de números para as instruções e locações de memória:
74 |
75 | ```
76 | Configure "total" para 0
77 | Configure "count" para 1
78 | [loop]
79 | Configure "compare" para "count"
80 | Subtraia 11 de "compare"
81 | Se "compare" é zero, continue até [fim]
82 | Adicione "count" em "total"
83 | Adicione 1 em "count"
84 | Continue até [loop]
85 | [fim]
86 | Saída "total"
87 | ```
88 |
89 | Neste ponto não é tão difícil ver como os programas trabalham. Você consegue? As primeiras duas linhas fornece duas locações de memória que iniciam os valores: `total` vai ser usado para construir o resultado da computação, e `count` mantém registrado o número que nós atualmente estamos olhando. As linhas usando `compare` são provavelmente as mais estranhas. O que o programa quer fazer é ver se já pode parar. Por causa da nossa máquina hipotética ser bastante primitiva, ela somente pode testar se um número é zero e fazer a decisão (salto) baseado nisto. Então, ela usa a locação de memória rotulada `compare` para computar o valor de `count` - 11 e fazer a decisão baseada neste valor. As próximas duas linhas adicionam o valor de `count` ao resultado e incrementam `count` por 1 cada vez que o programa decide que não é 11 ainda.
90 |
91 | Aqui temos o mesmo programa em JavaScript:
92 |
93 | ```javascript
94 | var total = 0, count = 1;
95 | while (count <= 10) {
96 | total += count;
97 | count += 1;
98 | }
99 | console.log(total);
100 | ```
101 |
102 | Isso nos dá muitas melhorias. E o mais importante, não é preciso mais especificar o caminho que nós queremos que o programa salte anteriormente ou adiante. Ele continua executando o bloco (envolvido nas chaves) até que a condição que foi dada seja: `count <= 10`, que significa "count é menor que ou igual a 10". Não temos mais que criar um valor temporário e compará-lo a zero. Isso é um detalhe desinteressante, e o poder das linguagens de programação é que elas tomam conta de detalhes desinteressantes para nós.
103 |
104 | No final do programa, depois de `while` ser definido, a operação `console.log` é aplicada ao resultado na ordem que escrevemos isso como *output* (saída).
105 |
106 | Finalmente, aqui temos o que o programa pode parecer se nós tivermos as operações convenientes `range` (alcance) e `sum` (soma) disponíveis, que respectivamente criam uma coleção de números com um alcance e computam a soma de uma coleção de números:
107 |
108 | ```javascript
109 | console.log(sum(range(1,10)));
110 | // 55
111 | ```
112 |
113 | A moral da história, então, é que o mesmo programa pode ser expresso de forma longa e curta, de forma legível ou não. A primeira versão do programa foi extremamente obscura, enquanto esta última é praticamente "Inglês": `log` (registre) a `sum` (soma) da `range` (extensão) dos números de 1 a 10. (Nós vamos ver nos próximos capítulos como criar coisas do tipo `sum` e `range`).
114 |
115 | Uma boa linguagem de programação ajuda o programador permitindo-o conversar sobre ações que o computador vai realizar em *alto nível*. Isto ajuda a deixar detalhes desinteressantes implícitos, e fornece construções convenientes de blocos (como o `while` e `console.log`), permitindo a você definir seus próprios blocos (como `sum` e `range`), e tornando simples a construção destes blocos.
116 |
117 | ## O que é JavaScript?
118 |
119 | O JavaScript foi introduzido em 1995, como uma forma de adicionar programas a páginas da web no navegador Netscape. A linguagem foi adaptada pela maioria dos navegadores gráficos da web. Ele fez a atual geração de aplicações web possível - clientes de email baseado no navegador, mapas e redes sociais - e também é usado em sites mais tradicionais para fornecer várias formas de interatividade e inteligência.
120 |
121 | É importante notar que JavaScript não tem quase nada a ver com a linguagem de programação Java. O nome similar foi inspirado por considerações de marketing, ao invés do bom senso. Quando o JavaScript foi introduzido, a linguagem Java estava sendo fortemente divulgada e ganhando popularidade. Alguém pensou ser uma boa ideia tentar trilhar junto com este sucesso. Agora estamos emperrados com este nome.
122 |
123 | Depois da adoção fora do Netscape, um documento padrão foi escrito para descrever uma forma que a linguagem deve trabalhar, com um esforço para certificar-se que as várias partes do software que afirmavam suportar JavaScript estavam realmente falando sobre a mesma linguagem. Foi chamado de padrão ECMAScript, depois da organização ter feito a padronização. Na prática, os termos ECMAScript e JavaScript podem ser usados como sinônimos - são dois nomes para a mesma linguagem.
124 |
125 | Tem alguns que vão dizer coisas *horríveis* sobre a linguagem JavaScript. Muitas dessas coisas são verdade. Quando eu fui obrigado a escrever algo em JavaScript, pela primeira vez, eu rapidamente vim a desprezá-lo - ele poderia interpretar qualquer coisa que eu digitei, mas interpretava de uma forma completamente diferente do que eu quis dizer. Isso teve muito a ver com o fato de que eu não tinha a menor ideia do que estava fazendo, claro, mas há uma questão real aqui: JavaScript é ridiculamente liberal no que ele permite. A ideia por trás deste padrão foi que isto tornaria a programação em JavaScript simples para iniciantes. Na realidade, na maior parte das vezes isto torna a detecção de problemas em seus programas difícil, porque o sistema não vai apontá-lo para você.
126 |
127 | Esta flexibilidade também tem suas vantagens. Isso dá espaço para muitas técnicas que são impossíveis em linguagens mais rígidas, e, como iremos ver em capítulos posteriores, isto pode ser usado para superar algumas deficiências do JavaScript. Depois de aprender corretamente e trabalhar com o JavaScript por um tempo, eu aprendi a realmente *gostar* desta linguagem.
128 |
129 | Tivemos várias *versões* do JavaScript. Versão 3 do ECMAScript foi a dominante, largamente suportado no tempo que o JavaScript ascendia para o domínio, aproximadamente entre 2000 e 2010. Durante este tempo, trabalho estava em andamento na versão 4 ambiciosa, que planeja um número de melhorias e extensões radicais para a linguagem. Porém, mudar de forma radical uma linguagem largamente usada pode ser politicamente difícil, e o trabalho na versão 4 foi abandonado em 2008, e conduzido para a 5ª edição que saiu em 2009. Estamos agora esperando que todos os maiores navegadores suportem a 5 edição, que é a linguagem da versão que este livro vai focar. O trabalho na 6ª edição está em curso.
130 |
131 | Navegadores web não são as únicas plataformas que o JavaScript é usado. Alguns banco de dados, como MongoDB e CouchDB, usam JavaScript como sua linguagem de consulta e script. Muitas plataformas para desktop e de programação no servidor, mais notável o projeto *Node.JS*, sujeito do capítulo (AINDA NÃO ESCRITO), fornecem um poderoso ambiente de programação JavaScript fora do navegador.
132 |
133 | ## Código, e o que fazer com ele
134 |
135 | Código é o texto que compõe os programas. Muitos capítulos deste livro contém muito código. Em minha experiência, escrever e ler códigos é uma importante parte do aprendizado da programação. Tenta não apenas olhar sobre os códigos, leia-os atenciosamente e os entenda. Isto pode ser lento e confuso no início, mas eu prometo que você vai rapidamente pegar o jeito. O mesmo acontece para os exercícios. Não assuma que você os entendeu até que você realmente tenha escrito uma solução que funcione.
136 |
137 | Eu recomendo que você teste suas soluções dos exercícios em um interpretador JavaScript real, para obter um feedback se o que você fez está funcionando ou não, e, esperançosamente, ser incentivado a experimentar e ir além dos exercícios.
138 |
139 | Quando ler este livro no seu navegador, você pode editar (e rodar) os programas exemplo clicando neles.
140 |
141 | Rodando programas JavaScript fora do contexto deste livro é possível também. Você pode optar por instalar o node.js, e ler a documentação para conhecer como usá-lo para avaliar arquivos de texto que contém programas. Ou você pode usar o console de desenvolvedores no navegador (tipicamente encontrado no menu "tools" ou "developer") e divertir-se nele. No capítulo (CORRIGIR!), o jeito que os programas são embutidos em páginas web (arquivos HTML) é explicado. Entretanto, você pode verificar em http://jsbin.com por outra interface amigável para rodar código JavaScript no navegador.
142 |
143 | ## Convenções Tipográficas
144 |
145 | Neste livro, texto escrito em fonte `monoespaçada` deve ser entendido por representações de elementos dos programas - algumas vezes são fragmentos auto-suficientes, e algumas vezes eles somente referenciam para alguma parte de um programa próximo. Programas (que você já viu um pouco), são escritos assim:
146 |
147 | ```javascript
148 | function fac(n) {
149 | if (n == 0)
150 | return 1;
151 | else
152 | return fac(n - 1) * n;
153 | }
154 | ```
155 |
156 | Algumas vezes, para mostrar a saída que o programa produz, a mesma será escrita abaixo dele, com duas barras e uma seta na frente:
157 |
158 | ```javascript
159 | console.log(fac(8));
160 | // → 40320
161 | ```
162 |
163 | Boa Sorte!
164 |
--------------------------------------------------------------------------------
/chapters/12-javascript-e-o-navegador.md:
--------------------------------------------------------------------------------
1 | # JavaScript e o Navegador
2 |
3 | > "O navegador é um ambiente realmente hostil de programação."
4 | >
5 | > - Douglas Crockford, The JavaScript Programming Language (video lecture)
6 |
7 | A próxima parte deste livro vai falar sobre os navegadores web. Sem os navegadores, não existiria JavaScript. E mesmo se existisse, ninguém daria atenção a ele.
8 |
9 | A tecnologia web, desde de o início, é descentralizada não apenas tecnicamente mas também na maneira que se evolui. Vários fornecedores de navegador tem adicionado funcionalidades *ad-hoc* e muita das vezes tem sido de maneiras mal pensadas, que acabam sendo adotadas por outros e finalmente viram um padrão.
10 |
11 | Isso é igualmente a uma benção e uma maldição. Por outro lado, isso reforça a não existência de uma particição central controlando um sistema mas o mesmo vem sendo melhorado por várias partes trabalhando com pouca colaboração (ou, ocasionalmente com franca hostilidade). Sendo assim a forma casual que a Web foi desenvolvida significa que o sistema resultante não é exatamente um brilhante exemplo interno de consistência. De fato, algumas partes são completamente bagunçadas e confusas.
12 |
13 | ## Redes e a Internet
14 |
15 | Redes de computador existem desde 1950. Se você colocar cabos entre dois ou mais computadores e permitir que eles enviem dados um para o outro por estes cabos, você pode fazer todo tipo de coisas maravilhosas.
16 |
17 | Se conectando duas máquinas no mesmo prédio permite que nós façamos coisas incríveis, conectando máquinas por todo o planeta deve ser ainda melhor. A tecnologia para começar a implementação desta visão foi desenvolvida em meados de 1980, e a rede resultante é chamada de *Internet*. Ela tem vivido desde a sua promessa.
18 |
19 | Um computador pode usar essa rede para enviar bits para outro computador. Para qualquer comunicação efetiva nascida desse envio de bits, os computadores em ambas as pontas devem conhecer qual a representação de cada bit. O significado de cada sequência de bits depende inteiramente do tipo de coisa que está tentando se expressar e o mecanismo de codificação usado.
20 |
21 | Um *protocolo de rede* descreve um estilo de comunicação em uma rede. Existem protocolos para mandar email, para receber email, para transferir arquivos, e até mesmo para controlar computadores que foram infectados por softwares maliciosos.
22 |
23 | Por exemplo, um simples protocolo de chat deve consistir em um computador enviando os bits que representam o texto "CHAT?" para outra máquina, e o outro respondendo "OK!" para confirmar que o protocolo foi entendido. Eles podem então proceder e enviar um para o outro `strings` de texto, ler o texto enviado um para o outro pela rede, e mostrar o que eles receberam nas suas telas.
24 |
25 | A maioria dos protocolos são feitos em cima de outros protocolos. Nosso exemplo de protocolo de chat considera a rede como um tipo de dispositivo de *stream*, no qual você pode enviar bits e recebe-lôs com destino correto e na ordem correta. Assegurar essas coisas atualmente é um problema técnico bastante difícil.
26 |
27 | O TCP (Protocolo de Controle de Transmissão) é um protocolo que resolve este problema. Todos os aparelhos conectados na Internet "falam" ele, e a maioria da comunicação na Internet é feita através dele.
28 |
29 | Uma conexão TCP funciona da seguinte maneira: um computador deve estar esperando, ou *ouvindo*, outros computadores que irão começar a falar com ele. Para ser capaz de escutar por diferentes tipos de comunicação ao mesmo tempo em uma única máquina, cada *ouvinte* tem um número (chamado de **porta**) associado a ele. A maioria dos protocolos especificam qual porta deve ser usada por padrão. Por exemplo, quando nós queremos mandar um email usando o protocolo SMTP, a máquina pelo qual enviaremos deve estar escutando na porta 25.
30 |
31 | Outro computador pode então estabelecer uma conexão se conectando na máquina alvo usando o número correto da porta. Se a máquina alvo pode ser encontrada e estiver escutando esta porta, a conexão vai ser criada com sucesso. O computador ouvinte é chamado de servidor, e o computador que está se conectando é chamado de cliente.
32 |
33 | Uma conexão atua como um encanamento de via dupla pelo qual bits podem ser transitados às máquinas nas duas extremidades contendo dados. Uma vez que os bits tenham sido transmitidos com sucesso, eles podem ser lidos novamente pela máquina do outro lado. Isso é um modelo conveniente. Você pode dizer que o TCP fornece uma abstração de uma rede.
34 |
35 | ## A Web
36 |
37 | A *World Wide Web* (não ser confundida com a Internet como um todo) é um conjunto de protocolos e formatos que nos permite visitar páginas web em um navegador. A parte "Web" no nome se refere ao fato destas páginas serem facilmente ligadas umas nas outras, e então se ligarem em uma grande malha onde os usuários podem se mover através desta.
38 |
39 | Para adicionar conteúdo na Web, tudo que você precisa fazer é conectar uma máquina a Internet, e deixá-la escutando na porta 80, usando o *Hypertext Transfer Protocol* (HTTP). Este protocolo permite outros computadores requisitarem documentos na rede.
40 |
41 | Cada documento na Web é nomeado por um *Universal Resource Locator* (URL), que se parece com algo assim:
42 |
43 | ```
44 | http://eloquentjavascript.net/12_browser.html
45 | | | | |
46 | protocolo servidor caminho (path)
47 | ```
48 |
49 | A primeira parte nos diz que esta URL usa o protocolo HTTP (ao contrário, por exemplo, do HTTP encriptado, que deve ser `https://`). Então vem a parte que identifica de qual servidor nós estamos requisitando o documento. Por último temos a string de caminho que identifica o documento específico (ou *resource*) que estamos interessados.
50 |
51 | Cada máquina conectada com a Internet recebe um *endereço IP* único, que se parece com `37.187.37.82`. Você pode usar isso diretamente como parte da URL. Porém listas de números mais ou menos aleatórios são difíceis de lembrar e estranho de se digitar, então ao invés disso você pode registrar um *nome de domínio* para apontar para uma máquina específica ou conjunto de máquinas. Eu registrei *eloquentjavascript.net* para apontar para o endereço IP da máquina que eu controlo e posso então usar o nome do domínio para servir páginas da web.
52 |
53 | Se você digitar a URL anterior na barra de endereços do seu navegador, ela vai tentar retornar e mostrar o documento dessa URL. Primeiro, seu navegador tem que encontrar qual endereço *eloquentjavascript.net* se refere. Então, usando o protocolo HTTP, ele faz a conexão ao servidor neste endereço e pergunta pelo documento */12_browser.html*.
54 |
55 | Vamos ver com mais detalhes sobre o protocolo HTTP no capítulo 17.
56 |
57 | ## HTML
58 |
59 | HTML, que significa *Hypertext Markup Language (Linguagem de marcação de hipertexto)*, é o formato de documento usado para as páginas web. Um documento HTML contém texto, bem como *tags* que fornecem estrutura para esse texto, descrevendo coisas como links, parágrafos e cabeçalhos.
60 |
61 | Um documento HTML simples, se parece com este:
62 |
63 | ```html
64 |
65 |
66 |
67 | My home page
68 |
69 |
70 |
74 |
75 |
76 | ```
77 |
78 | As *tags*, definidas entre os sinais de menor e maior que (< e >), fornecem informações sobre a estrutura do documento. O conteúdo restante é apenas texto puro.
79 |
80 | O documento começa com ``, que diz ao navegador para interepretá-lo como HTML *moderno* (HTML5), ao invés de outras versões que foram usadas no passado.
81 |
82 | Documentos HTML possuem um `head` (cabeça) e um `body` (corpo). O `head` contém informações *sobre* o documento, o `body` contém o documento em si. Neste caso, nós primeiro declaramos que o título do documento é *"My home page"* e em seguida, declaramos o `body` contendo um cabeçalho (`
`, que significa *"heading 1"* - As *tags* de `
` a `
` produzem cabeçalhos menores) e dois parágrafos (`
`).
83 |
84 | *Tags* aparecem em diversas formas. Um elemento, como o `
`, um parágrafo ou um link, começa com uma *tag* de abertura como em `
` e `` foram retiradas. O navegador sabe que a *tag* `` pertence ao `head`, e que `
` pertence ao `body`. Além disso, eu não especifiquei o final dos parágrafos, o fato de começar um novo parágrafo ou fechar o documento irá implicitamente fechá-los. As aspas que envolviam o destino do link também foram retiradas.
108 |
109 | Esse livro geralmente vai omitir as tags ``, `` e `` dos exemplos para mantê-los curtos e ordenados. Mas eu irei fechar as *tags* e incluir aspas nos valores de atributos.
110 |
111 | Eu geralmente também irei omitir o *doctype*. Isso não deve ser interpretado como um incentivo a omitir declarações de *doctype*. Os navegadores frequentemente irão fazer coisas ridículas quando você esquece delas. Você deve considerá-las implicitamente presentes nos exemplos, mesmo quando elas não forem mostradas no texto.
112 |
113 | ## HTML e JavaScript
114 |
115 | No contexto desse livro, a *tag* mais importante do HTML é `
120 | ```
121 |
122 | Esse *script* será executado assim que a *tag* `
129 | ```
130 |
131 | O arquivo `code/hello.js` incluído aqui contém o mesmo simples programa, `alert("hello!")`. Quando uma página HTML referencia outras URLs como parte de si, por exemplo um arquivo de imagem ou um *script*, os navegadores irão buscá-los imediatamente e incluí-los na página.
132 |
133 | Uma *tag* de *script* deve sempre ser fechada com ``, mesmo quando fizer referência para um arquvio externo e não contenha nenhum código. Se você esquecer disso, o restante da página será interpretado como parte de um *script* .
134 |
135 | Alguns atributos podem conter um programa JavaScript. A *tag* `