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]