Uma Reintrodução Ao JavaScript (Tutorial de JS) - JavaScript - MDN
Uma Reintrodução Ao JavaScript (Tutorial de JS) - JavaScript - MDN
MDN Plus now available in your country! Support MDN and make it your own. Learn
more ✨
This page was translated from English by the community. Learn more and join the
MDN Web Docs community.
Visão Geral
A JavaScript é uma linguagem dinâmica orientada a objetos; tem tipos e operadores,
objetos e métodos. Sua sintaxe vem das linguagens Java e C, por isso tantas estruturas
dessas linguagens se aplicam a JavaScript também. Uma das principais diferenças é que
o JavaScript não tem classes; em vez disso, a funcionalidade de classe é realizada por
protótipos de objetos. A outra diferença principal é que as funções são objetos, dando as
funções a capacidade para armazenar código executável e serem passadas como
parametro para qualquer outro objeto.
Vamos começar pelo bloco de construção de qualquer linguagem: os tipos. Programas
JavaScript manipulam valores, e esses valores todos pertencem a um tipo. Tipos de
JavaScript são :
números
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 2/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
strings
booleanos
funções
objetos
... Ops, e o "indefinido" e o "nulo"- , que parecem um pouco estranhos. E arrays (vetores),
que são um tipo especial de objeto. E as datas e expressões regulares, que são objetos
que você ganha de graça. E para ser tecnicamente preciso, as funções são apenas um
tipo especial de objeto. Assim, a lista de tipos se parece mais com isto:
números (numbers)
strings (strings)
booleanos (booleans)
objetos (objects)
funções (functions)
vetores (arrays)
datas (dates)
expressoes regulares (regexp)
nulo (null)
indefinido (undefined)
E existem também alguns tipos para erros. As coisas são muito mais fáceis se ficarmos
com a primeira lista, no entanto.
Números
Números em JavaScript são "valores de precisão dupla no formato IEEE 754", de acordo
com a especificação. Isto tem algumas consequências interessantes. Não existe essa
coisa de inteiro em JavaScript, então você deve ser um pouco cuidadoso com seus
cálculos se você está acostumado a matemática em C ou Java. Cuidado com coisas
como:
0.1 + 0.2 == 0.30000000000000004
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 3/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Na prática, valores inteiros são tratados como inteiros de 32 bits (e são armazenados
dessa forma em algumas implementações do navegador), que podem ser importantes
para as operações bit a bit. Para mais detalhes, consulte The Complete JavaScript
Number Reference .
Os operadores numéricos padrões são suportados, incluindo adição, subtração, módulo
(ou resto) aritmético e assim por diante. Há também um objeto embutido que eu esqueci
de mencionar mais cedo chamado Math para manipular funções e constantes
matemáticas mais avançadas:
Math.sin(3.5);
var d = Math.PI * r * r;
Você pode converter uma string em um inteiro usando a função embutida parseInt() .
Ela tem um segundo parâmetro opcional para a base da conversão, parâmetro esse que
você deveria sempre prover:
> parseInt("123", 10)
123
Você também pode usar o operador unário + para converter valores em números:
> + "42"
42
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 4/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Um valor especial chamado NaN (sigla de "Not a Number ou Não é Número") é retornado
se a string não é um valor numérico:
> parseInt("hello", 10)
NaN
NaN é tóxico: Se você provê-lo como uma entrada para qualquer operação matemática o
resultado também será NaN :
> NaN + 5
NaN
true
Infinity
> -1 / 0
-Infinity
Você pode testar se o valor é Infinity , -Infinity e NaN usando a função embutida
isFinite() :
> isFinite(1/0)
false
> isFinite(-Infinite)
false
> isFinite(NaN)
false
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 5/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Strings
Strings em JavaScript são sequências de caracteres. Para ser mais exato, elas são
sequências de Unicode characters, em que cada um deles é representado por um número
de 16-bits. Isso deveria ser uma notícia bem-vinda para aqueles que tiveram que lidar com
internacionalização.
Se você quiser representar um único caractere, você só tem que usar uma string de
tamanho 1.
Para obter o tamanho de uma string, acesse sua propriedade length :
> "hello".length
Essa é nossa primeira pincelada com objetos JavaScript! Eu mencionei que strings
também são objetos? De modo que elas têm métodos:
> "hello".charAt(0)
goodbye, world
> "hello".toUpperCase()
HELLO
Outros tipos
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 6/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
No JavaScript há distinção entre null , que é um objeto do tipo 'object' para indicar
deliberadamente uma ausência de valor, do undefined , que é um objeto do tipo
'undefined' para indicar um valor não inicializado — isto é, que um valor não foi atribuído
ainda. Vamos falar sobre variáveis depois, mas em JavaScript é possível declarar uma
variável sem atribuir um valor para a mesma. Se você fizer isso, a variável será do tipo
undefined .
JavaScript tem um tipo boolean, ao qual são possíveis os valores true e false (ambos
são palavras-chave). Qualquer valor pode ser convertido em um boolean, de acordo com
as seguintes regras:
1. false , 0 , a string vazia( "" ), NaN , null , e undefined todos tornam-se false
2. todos os outros valores tornam-se true
Você pode fazer essa conversão explicitamente usando a função Boolean() :
> Boolean("")
false
> Boolean(234)
true
Contudo, essa é uma necessidade rara, uma vez que JavaScript silenciosamente fará essa
conversão quando for esperado um boolean, como em uma instrução if . Por isso,
algumas vezes falamos simplesmente em "valores true" e "valores false" nos referindo a
valores que se tornaram true e false , respectivamente, quando convertidos em
boolean. Alternativamente, esses valores podem ser chamados de "truthy"
(verdade/verdadeiro) e "falsy" (falso/falsidade), respectivamente.
Operações booleanas como && (and lógico), || (or lógico), e ! (not lógico) são
suportadas.
Variáveis
Novas variáveis em JavaScript são declaradas usando a palavra-chave var :
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 7/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
var a;
Se você declarar uma variável sem atribuir qualquer valor a ela, seu tipo será undefined .
Uma diferença importante de outras linguagens como Java é que em JavaScript, blocos
não tem escopo; somente funções tem escopo. De modo que se uma variável é definida
usando var numa instrução composta (por exemplo dentro de uma estrutura de controle
if ), ela será visível por toda a função.
Obs: A definição de variáveis usando o let foi introduzida no ECMAScript 6. O let permite
escopo de bloco, ou seja, é possível definir uma variável em um bloco if , e esta variável
ter escopo limitado ao bloco if - por exemplo.
Operadores
Operadores numéricos de JavaScript são + , - , * , / e % - que é o operador resto.
Valores são atribuídos usando = , e temos também as instruções de atribuição
compostas, como += e -= . Essas são o mesmo que x = x operador y .
x += 5
x = x + 5
hello world
Se você adicionar uma string a uma número (ou outro valor) tudo será convertido em uma
string primeiro. Isso talvez seja uma pegadinha para você:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 8/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
> "3" + 4 + 5
345
> 3 + 4 + "5"
75
Adicionar uma string em branco a algo é uma maneira melhor de fazer a conversão.
Comparações em JavaScript podem ser feitas usando < , > , <= e >= . Isso funciona
tanto para strings como para números. A igualdade é um pouco menos simples. O
operador igual-duplo faz a coersão de tipo se você colocar tipos diferentes, algumas
vezes com resultados interessantes:
> "dog" == "dog"
true
> 1 == true
true
false
true
Estruturas de Controle
JavaScript tem um conjunto de estruturas de controle similar à outras linguagens na
família do C. Instruções condicionais são suportadas pelo if e else ; você pode
encadeá-los se quiser:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 9/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
if (name == "puppies") {
name += "!";
name += "!!";
} else {
name == "kittens!!"
// an infinite loop!
var input;
do {
input = get_input();
} while (inputIsNotValid(input))
O laço for do JavaScript é o mesmo que no C e Java: ele lhe permite prover as
informações para o seu laço em uma única linha.
for (var i = 0; i < 5; i++) {
Os operadores && e || usam a lógica de curto-circuito, o que quer dizer que, o segundo
operando ser executado dependerá do primeiro operando. Isso é útil para checagem de
objetos null antes de acessar seus atributos:
var name = o && o.getName();
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 10/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
A instrução switch pode ser usada para múltiplas ramificações baseadas em um número
ou uma string:
switch(action) {
case 'draw':
drawit();
break;
case 'eat':
eatit();
break;
default:
donothing();
Se você não adicionar a instrução break , a execução irá "cair" no próximo nível. Isso é
algo que raramente vai querer fazer — de fato vale mais a pena colocar um comentário
especificando essa "queda" para o próximo nível, pois isso o ajudará na hora de fazer a
depuração de seu código:
switch(a) {
case 1: // queda
case 2:
eatit();
break;
default:
donothing();
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 11/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
A cláusula default é opcional. Se quiser, pode colocar expressões tanto no switch como
nos cases; Comparações acontecem entre os dois usando o operador === :
switch(1 + 3) {
case 2 + 2:
yay();
break;
default:
neverhappens();
Objetos
Objetos JavaScript são simplesmente coleções de pares nome-valor. Como tal, eles são
similares à:
Dicionários em Python
Hashes em Perl e Ruby
Hash tables em C e C++
HashMaps em Java
Vetores associativos em PHP
Esse tipo de estrutura de dados é largamente utilizada, o que atesta sua versatilidade.
Uma vez que tudo em JavaScript é um objeto (tipos básicos principais), qualquer
programa JavaScript naturalmente envolve uma grande quantidade de buscas em tabelas
hash, o que é algo bom, pois elas são bem rápidas!
A parte "name" é uma string JavaScript, enquanto o valor pode ser qualquer valor
JavaScript — incluindo mais objetos. Isso permite que você construa estruturas de dados
de qualquer complexidade.
Há basicamente duas formas de criar um objeto vazio:
var obj = new Object();
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 12/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
e:
var obj = {};
E...
obj["name"] = "Simon";
A sintaxe de objeto literal pode ser usada para inicializar completamente um objeto:
var obj = {
name: "Carrot",
"for": "Max",
details: {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 13/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
color: "orange",
size: 12
orange
> obj["details"]["size"]
12
Vetores
Vetores em JavaScript são, de fato, um tipo especial de objeto. Eles funcionam de forma
muito similar à objetos regulares (propriedades numéricas podem naturalmente ser
acessadas somente usando a sintaxe [], colchetes ), porém eles tem uma propriedade
mágica chamada ' length '. Ela sempre é o maior índice de um vetor mais 1.
A forma tradicional de se criar um vetor em JavaScript é a seguinte:
> var a = new Array();
> a.length
> a.length
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 14/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Deixar uma vírgula à direita no final de um vetor literal gerará inconsistência entre os
navegadores, portanto não faça isso.
Note que array.length não é necessariamente o número de itens em um vetor.
Considere o seguinte:
> var a = ["dog", "cat", "hen"];
> a.length
101
undefined
Isso é um pouco ineficaz visto que você está procurando a propriedade length uma vez a
cada iteração. Uma melhoria poderia ser:
for (var i = 0, len = a.length; i < len; i++) {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 15/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Aqui nós estamos declarando duas variáveis. A atribuição na parte do meio do laço for é
também testada — se for verdadeira, o laço continuará. Uma vez que o i é incrementado
toda vez, os itens do array serão atribuídos a variável item sequencialmente. A iteração é
finalizada quando item "falsy" é encontrado (tal como o undefined , false ou zero).
Note que esse truque só deveria ser usado em vetores que você sabe não conter valores
"falsy" (vetores de objeto ou nós DOM por exemplo). Se você iterar sobre dados
numéricos que possam ter o 0 ou sobre dados string que possam ter uma string vazia,
você deveria usar a segunda forma como alternativa.
Uma outra forma de iterar é usar o laço for...in . Note que se alguém adicionou novas
propriedades ao Array.prototype , elas também podem ser iteradas usando este laço:
for (var i in a) {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 16/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Funções
Junto com objetos, funções são os componentes principais para o entendimento do
JavaScript. A função mais básica não poderia ser mais simples:
function add(x, y) {
var total = x + y;
return total;
Isso demonstra tudo o que há para se saber sobre funções básicas. Uma função
JavaScript pode ter 0 ou mais parâmetros declarados. O corpo da função pode conter
tantas instruções quantas quiser e pode declarar suas próprias variáveis que são de
escopo local àquela função. A instrução return pode ser usada para retornar um valor
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 17/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Você também pode passar mais argumentos do que a função está esperando:
> add(2, 3, 4)
Pode parecer um pouco bobo, mas no corpo da função você tem acesso a uma variável
adicional chamada arguments , que é um objeto parecido com um vetor que contém todos
os valores passados para a função. Vamos rescrever a função add para tomarmos tantos
valores quanto quisermos:
function add() {
var sum = 0;
sum += arguments[i];
return sum;
> add(2, 3, 4, 5)
14
Isso realmente não é muito mais útil do que escrever 2 + 3 + 4 + 5 . Vamos criar uma
função para calcular média:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 18/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
function avg() {
var sum = 0;
sum += arguments[i];
> avg(2, 3, 4, 5)
3.5
Isso é muito útil, mas introduz um novo problema. A função avg() precisa de uma lista de
argumentos separados por vírgula — mas e se o que quiser for procurar a média de um
vetor? Você poderia apenas rescrever a função da seguinte forma:
function avgArray(arr) {
var sum = 0;
sum += arr[i];
3.5
Porém, seria legal se pudéssemos reusar a função que já tínhamos criado. Felizmente,
JavaScript lhe permite chamar a função, e chamá-la com um conjunto arbitrário de
argumentos, usando o método apply() presente em qualquer objeto função.
> avg.apply(null, [2, 3, 4, 5])
3.5
O segundo argumento do apply() é o vetor para usar como argumento; o primeiro será
discutido mais tarde. Isso enfatiza o fato que funções também são objetos.
JavaScript lhe permite criar funções anônimas.
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 19/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
var sum = 0;
sum += arguments[i];
> var b = 2;
> (function() {
var b = 3;
a += b;
})();
> a
> b
JavaScript lhe permite chamar funções recursivamente. Isso é particularmente útil quando
estamos lidando com estruturas de árvore, como quando estavamos navegando no DOM.
function countChars(elm) {
if (elm.nodeType == 3) { // TEXT_NODE
return elm.nodeValue.length;
var count = 0;
count += countChars(child);
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 20/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
return count;
if (elm.nodeType == 3) { // TEXT_NODE
return elm.nodeValue.length;
var count = 0;
count += counter(child);
return count;
})(document.body);
O nome provido para a função anônima conforme acima só é (ou no mínimo só deveria
ser) visível ao escopo da própria função. Isso tanto permite que mais otimizações sejam
feitas pela engine como deixa o código mais legível.
Objetos Personalizados
Nota: Para uma discursão mais detalhada de programação orientada a objetos
em JavaScript, veja Introdução a JavaScript Orientado a Objeto.
Na clássica Programação Orientada a Objetos, objetos são coleções de dados e métodos
que operam sobre esses dados. JavaScript é uma linguagem baseada em protótipos que
não contém a estrutura de classe, como tem em C++ e Java. (Algumas vezes isso é algo
confuso para o programador acostumado a linguagens com estrutura de classe). Em vez
disso, JavaScript usa funções como classes. Vamos considerar um objeto pessoa com os
campos primeiro e último nome. Há duas formas em que o nome talvez possa ser exibido:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 21/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
como "primeiro nome segundo nome" ou como "último nome, primeiro nome". Usando as
funções e objetos que discutimos anteriormente, aqui está uma forma de fazer isso:
function makePerson(first, last) {
return {
first: first,
last: last
function personFullName(person) {
function personFullNameReversed(person) {
> personFullName(s)
Simon Willison
> personFullNameReversed(s)
Willison, Simon
Isso funciona, mas é muito feio. Você termina com dúzias de funções em seu escopo
global. O que nós realmente precisamos é uma forma de anexar uma função a um objeto.
Visto que funções são objetos, isso é fácil:
function makePerson(first, last) {
return {
first: first,
last: last,
fullName: function() {
},
fullNameReversed: function() {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 22/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
> s.fullName()
Simon Willison
> s.fullNameReversed()
Willison, Simon
Há algo aqui que não havíamos visto anteriormente: a palavra-chave ' this '. Usada dentro
de uma função, ' this ' refere-se ao objeto corrente. O que aquilo de fato significa é
especificado pelo modo em que você chamou aquela função. Se você chamou-a usando
notação ponto ou notação colchete em um objeto, aquele objeto torna-se ' this '. Se a
notação ponto não foi usada pela chamada, ' this ' refere-se ao objeto global. Isso é uma
frequente causa de erros. Por exemplo:
> s = makePerson("Simon", "Willison")
> fullName()
undefined undefined
Quando chamamos fullName() , ' this ' está ligado ao objeto global. Visto que não há
variáveis globais chamadas first ou last obtemos undefined para cada um.
Podemos tirar vantagem da palavra chave ' this ' para melhorar nossa função
makePerson :
this.first = first;
this.last = last;
this.fullName = function() {
this.fullNameReversed = function() {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 23/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Nós introduzimos uma outra palavra-chave: ' new '. new é fortemente relacionada a ' this '.
O que ele faz é criar um novo objeto vazio, e então chamar a função especificada com
' this ' para atribuir aquele novo objeto. Funções que são desenhadas para ser chamadas
pelo ' new ' são chamadas de funções construtoras. Uma prática comum é capitular essas
funções como um lembrete de chamá-las com o new .
Nossos objetos pessoa estão ficando melhor mas ainda existem algumas arestas feias.
Toda vez que criamos um objeto pessoa, criamos duas marcas de nova função dentro
dele — não seria melhor se este código fosse compartilhado?
function personFullName() {
function personFullNameReversed() {
this.first = first;
this.last = last;
this.fullName = personFullName;
this.fullNameReversed = personFullNameReversed;
Assim está melhor: estamos criando as funções de método apenas uma vez, e atribuimos
referências para elas dentro do construtor. Podemos fazer algo melhor do que isso? A
resposta é sim:
function Person(first, last) {
this.first = first;
this.last = last;
Person.prototype.fullName = function() {
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 24/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Person.prototype.fullNameReversed = function() {
> s.firstNameCaps();
return this.first.toUpperCase()
> s.firstNameCaps()
SIMON
Curiosamente, você pode também adicionar coisas para o protótipo de objetos built-in de
Javascript. Vamos adicionar um método para String que retorna a string invertida:
> var s = "Simon";
> s.reversed()
result[start] = this[end]
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 25/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
result[end] = this[start]
start++, end--
return result.join('')
> s.reversed()
nomiS
Como antes mencionado, o protótipo forma parte de uma cadeia. A raiz dessa cadeia é
Object.prototype , dos quais inclui o método toString() — este é o método que é
chamado quando você tenta representar um objeto como uma string. Isto é útil para
depurar os nossos objetos Person :
> var s = new Person("Simon", "Willison");
> s
[object Object]
> s
Lembra como avg.apply() tinha um primeiro argumento null? Nós podemos revisitar isto,
agora. O primeiro argumento para apply() é o objeto que deve ser tratado como ' this '.
Por exemplo, aqui está uma implementação trivial de ' new ':
function trivialNew(constructor, ...args) {
constructor.apply(o, args);
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 26/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
return o;
Isto não é exatamente uma réplica de new porque não configura a cadeia de protótipos.
apply() é difícil de ilustrar — não é algo que você usa com frequência, mas é útil
conhecer a respeito. No código acima, ...args é chamado de "argumentos rest" — como
o nome indica, isto contém o restante dos parâmetros.
Ao chamar
var bill = trivialNew(Person, 'Willian', 'Orange');
é equivalente a
var bill = new Person('Willian', 'Orange');
apply() tem uma função irmã de nome call , que novamente permite você configurar o
' this ' mas toma uma lista expandida de argumentos, ao invés de um array.
function lastNameCaps() {
return this.last.toUpperCase();
lastNameCaps.call(s);
s.lastNameCaps = lastNameCaps;
s.lastNameCaps();
Funções Internas
Em JavaScript é permitido declarar uma função dentro de outras funções. Nós já vimos
isso antes, com uma versão preliminar da função makePerson() . Um detalhe importante
sobre funções aninhadas em JavaScript é que elas podem acessar as variáveis do escopo
das funções parente:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 27/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
function parentFunc() {
var a = 1;
function nestedFunc() {
return a + b;
return nestedFunc(); // 5
Clausuras (Closures)
Isto nos leva a uma das abstrações mais poderosas que JavaScript tem a oferecer — mas
também a mais potencionalmente confusa. O que isto faz?
function makeAdder(a) {
return function(b) {
return a + b;
};
var x = makeAdder(5);
var y = makeAdder(20);
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 28/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
x(6); // ?
y(7); // ?
O nome da função makeAdder já diz tudo: ela cria novas funções 'adder', na qual, quando
chamada com um argumento, adiciona o argumento com a que foi criada.
O que está acontecendo aqui é muito parecido com o que estava acontencedo com as
funções internas vistas anterioremente: uma função definida dentro de uma outra função
tem acessso às variáveis da função de fora. A única diferença aqui é que a função de fora
retornou e, como consequência do senso comum, deve dizer que todas as variáveis locais
não existem mais. Mas elas ainda existem — caso contrário a função adicionadora não
seria capaz de funcionar. Mais ainda, há duas "cópias" diferentes de variáveis locais para
makeAdder — uma na qual o a é 5 e a outra na qual a é 20. Então, o resultado dessas
chamadas de funções é o seguinte:
x(6) // returns 11
y(7) // returns 27
Eis o que acontece na verdade: sempre que o JavaScript executa uma função, um objeto
de 'escopo' é criado para guardar as variáveis locais criadas dentro desta função. Ela é
inicializada com quaisquer variáveis passadas como parâmetros da função. Isto é similar
ao objeto global, em que todas as variáveis globais e funções vivem, mas com algumas
diferenças importantes: primeiro, um novo objeto de escopo é criado toda a vez que uma
função começa a executar, e segundo, diferente do objeto global (que nos navegadores é
acessado com window ) estes objetos não podem ser diretamente acessados através do
seu código JavaScript. Não há nenhum mecanismo para iterar sobre as propriedades do
escopo corrente do objeto, por exemplo.
Então, quando makeAdder é chamado, um objeto de escopo é criado com uma única
propriedade: a , a qual é o argumento passado para a função makeAdder . makeAdder
então retorna uma nova função criada. Normalmente o coletor de lixo de JavaScript
poderia limpar o objeto de escopo criado para makeAdder neste ponto, mas a função de
retorno mantém uma referência ao objeto de escopo. Como resultado, o objeto de escopo
não será coletado como lixo até que não haja mais referências para função objeto que
makeAdder retornou.
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 29/30
23/11/2022 11:47 Uma reintrodução ao JavaScript (Tutorial de JS) - JavaScript | MDN
Objetos de escopo formam uma cadeia chamada de cadeia de escopos, similar a cadeia
de protótipos usadas no sistema de objetos de JavaScript.
Uma clausura é a combinação de uma função e o objeto de escopo na qual é criado.
Clausuras permitem você guardar estado — de tal forma, elas podem ser frequentemente
utilizadas no lugar de objetos.
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_Overview 30/30