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