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]