Agora que você domina
o básico de funções,
gostaria de falar sobre um tópico que
pode se tornar um pouco complicado.
A diferença entre variáveis
locais e globais.
Estes termos podem não significar
nada para você agora.
Então, vamos começar
com um exemplo.
Criei este programa para mostrar quantas
polegadas cresci na minha infância.
Visto que humanos crescem
a taxas diferentes,
desenvolvi esta função
calcInches (calcPolegadas).
cujos argumentos são:
startAge (idadeInicial),
endAge (idadeFinal)
e inchesPerYear (polegadasPorAno).
Ela calculará o crescimento total,
em polegadas, durante aquele período
e então retornará o resultado
para quem quer que a chamou.
Podemos ver aqui que de
zero a oito anos
eu chamo calcInches e passo zero,
oito e 2,5 como parâmetros.
porque eu cresci aproximadamente
2,5 polegadas por ano.
Então ela faz o cálculo e retorna 20.
De oito para dezesseis, eu passei
oito, dezesseis e dois.
porque eu não cresci tanto e pode-se
ver que ela retorna dezesseis.
Isso é agradável, mas
agora quero, na verdade,
mostrar quantas polegadas
eu cresci no total,
durante toda minha infância.
Então, como faço isso?
Bem, eu poderia começar a olhar
meu código e pensar...
quais valores eu tenho aqui?
Será que tenho alguma coisa que
represente o total de polegadas?
Veja, eu tenho esta variável
totalInches (totalPolegadas)
dentro da minha função
calcInches (calcPolegadas).
Nesse caso, eu poderia
simplesmente mostrá-la,
e ver seu valor, começar por aí.
Então, escrevemos:
text(totalInches, 10, 200)
e colocamos isso na parte inferior.
Ok, vamos ver o que temos.
Apareceu o cara do 'Oh noes!'.
E ele diz que há um problema:
"totalInches não está definida."
Isso, é estranho porque definimos
totalInches bem aqui, certo?
var totalInches igual...
Bem, o problema é que declaramos
totalInches dentro de uma função,
nesta linha aqui.
E quando declaramos uma variável
dentro de uma função,
a variável é considerada local.
Ela vive apenas dentro desta função aqui
e o código fora da função, isso tudo,
não enxerga variáveis locais
dentro de funções.
Apenas vê o que quer
que retorne da função.
Apenas vê o valor, mas não a variável.
Então quando tentamos usar
totalInches fora da função,
o código não sabe o que é.
Ele apenas diz: "Ei, eu nunca vi esta
variável antes. Ela não está definida.
Não posso mostrá-la."
Mas, existe uma maneira que
podemos fazer isso, tal que o código
de fora possa ver esta variável, ou seja,
se tornarmos esta variável local
em uma variável global.
Podemos fazer isso, movendo a definição
dela para fora da função,
para o que chamamos de escopo global.
Agora, dentro da função, tudo que
estamos fazendo é
mudando o valor dela cada vez e
não definindo-a e declarando-a.
Veja que é mostrado "Crescimento
total durante a vida: 16".
Então, ele encontrou a variável, porque
a definimos em um escopo global.
Mas este não é exatamente o
valor que estamos procurando.
Este é apenas o valor mais recente.
Isso é porque toda vez que
chamamos esta função,
ela atribui a totalInches o que quer
que esteja calculando daquela vez, certo?
O que realmente queremos
é uma nova variável,
que usaremos apenas para
armazenar o total geral,
a qual aumentaremos sempre que
calcularmos o total para um período.
Nesse caso, vamos alterar isso de volta
para ser uma variável local
e vamos criar uma nova variável global
chamada lifeInches (vidaPolegadas).
Vamos iniciá-la com zero.
Depois, dentro da função,
incrementaremos esta
variável global, escrevendo:
lifeInches += totalInches.
Então, adicionaremos a ela ...
qualquer tanto que for calculado cada vez
que chamarmos esta função.
Iremos adicioná-lo à variável
global lifeInches.
Depois, após a última linha,
mostraremos lifeInches:
text(lifeInches, 10, 200)
Nosso crescimento total durante a vida.
Não é minha altura de verdade.
Sou maior que isso.
Mas é porque começamos nascidos
com comprimento maior que zero.
Então, se quero o total eu poderia
talvez começar em 20.
E aí está! Essa é minha altura.
Certo, então vamos revisar.
totalInches é o que chamamos
de variável local.
Sabemos isso porque ela foi
declarada dentro desta função
e não fora de uma função.
Isso significa que este código de fora
não conhece a variável totalInches.
Agora, lifeInches é o que chamamos
de variável global.
Sabemos disso porque vemos sua
declaração fora de qualquer função,
em um escopo global.
Então, tente lembrar disso quando estiver
escrevendo funções e suas variáveis
e pense consigo mesmo
se você quer uma variável local para
ser usada apenas por sua função
ou uma variável global, para
se programa inteiro utilizar.
Não se preocupe se isso
te faz quebrar a cabeça.
É um dos conceitos mais difíceis
em programação
e em Javascript, em particular.
Você ficará bom nisso com a prática.
Legendado por [Carlos A. N. C. R.]
Revisado por [Fernando dos Reis]