WEBVTT 00:00:00.710 --> 00:00:03.134 Agora que você domina o básico de funções, 00:00:03.134 --> 00:00:07.574 gostaria de falar sobre um tópico que pode se tornar um pouco complicado. 00:00:07.574 --> 00:00:11.228 A diferença entre variáveis locais e globais. 00:00:11.228 --> 00:00:14.241 Estes termos podem não significar nada para você agora. 00:00:14.241 --> 00:00:16.542 Então, vamos começar com um exemplo. 00:00:16.542 --> 00:00:20.178 Criei este programa para mostrar quantas polegadas cresci na minha infância. 00:00:20.178 --> 00:00:22.329 Visto que humanos crescem a taxas diferentes, 00:00:22.329 --> 00:00:24.681 desenvolvi esta função calcInches (calcPolegadas). 00:00:24.681 --> 00:00:25.690 cujos argumentos são: 00:00:25.690 --> 00:00:27.921 startAge (idadeInicial), endAge (idadeFinal) 00:00:27.921 --> 00:00:29.661 e inchesPerYear (polegadasPorAno). 00:00:29.661 --> 00:00:34.601 Ela calculará o crescimento total, em polegadas, durante aquele período 00:00:34.601 --> 00:00:37.456 e então retornará o resultado para quem quer que a chamou. 00:00:37.456 --> 00:00:40.329 Podemos ver aqui que de zero a oito anos 00:00:40.329 --> 00:00:44.840 eu chamo calcInches e passo zero, oito e 2,5 como parâmetros. 00:00:44.840 --> 00:00:48.426 porque eu cresci aproximadamente 2,5 polegadas por ano. 00:00:48.426 --> 00:00:52.373 Então ela faz o cálculo e retorna 20. 00:00:52.373 --> 00:00:58.000 De oito para dezesseis, eu passei oito, dezesseis e dois. 00:00:58.000 --> 00:01:01.710 porque eu não cresci tanto e pode-se ver que ela retorna dezesseis. 00:01:01.710 --> 00:01:04.852 Isso é agradável, mas agora quero, na verdade, 00:01:04.852 --> 00:01:07.035 mostrar quantas polegadas eu cresci no total, 00:01:07.035 --> 00:01:09.011 durante toda minha infância. 00:01:09.011 --> 00:01:11.623 Então, como faço isso? 00:01:11.623 --> 00:01:15.094 Bem, eu poderia começar a olhar meu código e pensar... 00:01:15.094 --> 00:01:17.094 quais valores eu tenho aqui? 00:01:17.094 --> 00:01:20.758 Será que tenho alguma coisa que represente o total de polegadas? 00:01:20.758 --> 00:01:24.088 Veja, eu tenho esta variável totalInches (totalPolegadas) 00:01:24.088 --> 00:01:26.471 dentro da minha função calcInches (calcPolegadas). 00:01:26.471 --> 00:01:28.665 Nesse caso, eu poderia simplesmente mostrá-la, 00:01:28.665 --> 00:01:30.555 e ver seu valor, começar por aí. 00:01:30.555 --> 00:01:31.530 Então, escrevemos: 00:01:31.530 --> 00:01:34.525 text(totalInches, 10, 200) 00:01:34.525 --> 00:01:36.336 e colocamos isso na parte inferior. 00:01:36.336 --> 00:01:37.879 Ok, vamos ver o que temos. 00:01:39.210 --> 00:01:41.201 Apareceu o cara do 'Oh noes!'. 00:01:41.201 --> 00:01:45.470 E ele diz que há um problema: "totalInches não está definida." 00:01:45.470 --> 00:01:49.735 Isso, é estranho porque definimos totalInches bem aqui, certo? 00:01:49.739 --> 00:01:52.018 var totalInches igual... 00:01:52.018 --> 00:01:57.772 Bem, o problema é que declaramos totalInches dentro de uma função, 00:01:57.772 --> 00:01:59.520 nesta linha aqui. 00:01:59.520 --> 00:02:02.139 E quando declaramos uma variável dentro de uma função, 00:02:02.139 --> 00:02:05.229 a variável é considerada local. 00:02:05.229 --> 00:02:09.043 Ela vive apenas dentro desta função aqui 00:02:09.043 --> 00:02:12.077 e o código fora da função, isso tudo, 00:02:12.077 --> 00:02:15.613 não enxerga variáveis locais dentro de funções. 00:02:15.613 --> 00:02:18.216 Apenas vê o que quer que retorne da função. 00:02:18.216 --> 00:02:21.538 Apenas vê o valor, mas não a variável. 00:02:21.538 --> 00:02:24.524 Então quando tentamos usar totalInches fora da função, 00:02:24.524 --> 00:02:26.147 o código não sabe o que é. 00:02:26.147 --> 00:02:29.847 Ele apenas diz: "Ei, eu nunca vi esta variável antes. Ela não está definida. 00:02:29.847 --> 00:02:31.581 Não posso mostrá-la." 00:02:31.971 --> 00:02:34.183 Mas, existe uma maneira que 00:02:34.183 --> 00:02:38.003 podemos fazer isso, tal que o código de fora possa ver esta variável, ou seja, NOTE Paragraph 00:02:38.003 --> 00:02:42.602 se tornarmos esta variável local em uma variável global. 00:02:42.602 --> 00:02:47.575 Podemos fazer isso, movendo a definição dela para fora da função, 00:02:47.575 --> 00:02:51.105 para o que chamamos de escopo global. 00:02:51.105 --> 00:02:54.476 Agora, dentro da função, tudo que estamos fazendo é 00:02:54.476 --> 00:02:58.489 mudando o valor dela cada vez e não definindo-a e declarando-a. 00:02:58.489 --> 00:03:02.715 Veja que é mostrado "Crescimento total durante a vida: 16". 00:03:02.715 --> 00:03:06.584 Então, ele encontrou a variável, porque a definimos em um escopo global. 00:03:06.584 --> 00:03:09.717 Mas este não é exatamente o valor que estamos procurando. 00:03:09.717 --> 00:03:11.460 Este é apenas o valor mais recente. 00:03:11.460 --> 00:03:13.726 Isso é porque toda vez que chamamos esta função, 00:03:13.726 --> 00:03:18.476 ela atribui a totalInches o que quer que esteja calculando daquela vez, certo? 00:03:19.087 --> 00:03:22.035 O que realmente queremos é uma nova variável, 00:03:22.035 --> 00:03:24.748 que usaremos apenas para armazenar o total geral, 00:03:24.748 --> 00:03:29.231 a qual aumentaremos sempre que calcularmos o total para um período. 00:03:29.231 --> 00:03:33.853 Nesse caso, vamos alterar isso de volta para ser uma variável local 00:03:33.853 --> 00:03:38.333 e vamos criar uma nova variável global chamada lifeInches (vidaPolegadas). 00:03:38.333 --> 00:03:40.762 Vamos iniciá-la com zero. 00:03:40.762 --> 00:03:42.996 Depois, dentro da função, 00:03:42.996 --> 00:03:46.053 incrementaremos esta variável global, escrevendo: 00:03:46.053 --> 00:03:48.970 lifeInches += totalInches. 00:03:48.970 --> 00:03:50.403 Então, adicionaremos a ela ... 00:03:50.403 --> 00:03:53.607 qualquer tanto que for calculado cada vez que chamarmos esta função. 00:03:53.607 --> 00:03:56.233 Iremos adicioná-lo à variável global lifeInches. 00:03:56.233 --> 00:03:58.888 Depois, após a última linha, mostraremos lifeInches: 00:03:58.888 --> 00:04:00.319 text(lifeInches, 10, 200) 00:04:01.267 --> 00:04:03.670 Nosso crescimento total durante a vida. 00:04:03.670 --> 00:04:06.383 Não é minha altura de verdade. Sou maior que isso. 00:04:06.383 --> 00:04:10.756 Mas é porque começamos nascidos com comprimento maior que zero. 00:04:10.756 --> 00:04:14.196 Então, se quero o total eu poderia talvez começar em 20. 00:04:14.196 --> 00:04:17.087 E aí está! Essa é minha altura. 00:04:17.087 --> 00:04:18.783 Certo, então vamos revisar. 00:04:18.783 --> 00:04:22.292 totalInches é o que chamamos de variável local. 00:04:22.292 --> 00:04:26.072 Sabemos isso porque ela foi declarada dentro desta função 00:04:26.072 --> 00:04:28.597 e não fora de uma função. 00:04:28.597 --> 00:04:34.703 Isso significa que este código de fora não conhece a variável totalInches. 00:04:34.703 --> 00:04:37.632 Agora, lifeInches é o que chamamos de variável global. 00:04:37.632 --> 00:04:41.451 Sabemos disso porque vemos sua declaração fora de qualquer função, 00:04:41.451 --> 00:04:43.524 em um escopo global. 00:04:43.524 --> 00:04:47.195 Então, tente lembrar disso quando estiver escrevendo funções e suas variáveis 00:04:47.195 --> 00:04:48.400 e pense consigo mesmo 00:04:48.400 --> 00:04:51.682 se você quer uma variável local para ser usada apenas por sua função 00:04:51.682 --> 00:04:54.743 ou uma variável global, para se programa inteiro utilizar. 00:04:54.743 --> 00:04:57.524 Não se preocupe se isso te faz quebrar a cabeça. 00:04:57.524 --> 00:05:00.116 É um dos conceitos mais difíceis em programação 00:05:00.116 --> 00:05:01.892 e em Javascript, em particular. 00:05:01.892 --> 00:05:04.428 Você ficará bom nisso com a prática. 00:05:04.428 --> 00:05:06.000 Legendado por [Carlos A. N. C. R.] Revisado por [Fernando dos Reis]