Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Uso de variáveis declaradas fora da função dentro da função

Na verdade não se trata de uma dúvida, é mais uma surpresa.

A variável "cores" foi declarada fora da função "desenhaCirculo( )".

Pensei que para utilizá-la dentro da função deveria passá-la como parâmetro, ou seja, posso utilizar qualquer variável que tenha sido declarada fora de uma função, dentro de uma função?

8 respostas

Olá Renato! Uma variável declarada fora de uma função é chamada de variável global, ela pode ser acessada por todo o programa, inclusive pelas instruções de dentro de uma função.

Já as variáveis declaradas dentro das funções são as chamadas variáveis locais, onde somente dentro daquela função específica ela pode ser acessada.

Abraços e sucesso nos estudos!

solução!

Oi Renato! Essa questão fica mais clara no último capítulo do curso. Mas já que você foi muito sagaz em perceber isso vai uma explicação complementar.

Veja o código:

var nome = "Flávio";
function exibeNome() {
   alert(nome);
}
exibeNome();

Isso funciona, porque uma função tem acesso a todas as outras variáveis que não foram declaradas dentro de funções. A variável nome foi declarada dentro de uma função? Não, então ela cai no escopo global. O escopo global é uma das formas de compartilhar um dado entre outras funções para quem esta começando no mundo da programação. Você verá ao longo da sua carreira que há alternativas para o escopo global, mas como eu disse, para quem esta começando ele cumpre o papel de permitir o compartilhamento de um dado entre funções.

Agora, se eu fizer isso:

function exibeNome() {
   var nome = 'Flávio';
  alert(nome);
}
exibeNome();

function exibeNome2() {
   alert(nome);
}

exibeNome2(); // não funciona

Como a variável nome foi declarada com var dentro de exibeNome, ela só exibe, ou melhor, só é enxergada dentro de exibeNome. Veja que exibeNome2 não tem acesso a ela.

Você só deve apelar para o escopo global em último caso. Sua observação de que as funções devem receber os dados que precisam via parâmetro é perfeita (clap clap clap!), mas há casos que isso é inviável e o escopo global faz a ponte entre as funções. Sendo assim, a regra de dedo é: consegue organizar seu código sem precisar do escopo global? Sim?Não? Se não, use-o com parcimônia.

Resumindo, essa discussão toda gira em torno do conceito de escopo de variáveis.

Assim como no primeiro curso, neste segundo eu quis ir bem devagar com certos conceitos para que o aluno faça algo rápido sem desanimar.

Beleza Renato?

Olá Flávio! Essa restrição ao uso de variáveis globais não conhecia. Pode nos dar um exemplo em que seu uso pode causar problemas?

Oi Renato, estou respondendo ao André. Pode pegar carona na explicação, mas nesse estágio, o escopo global é seu amigo, tudo bem? É uma resposta mais específica e avançada para o estágio no qual nos encontramos neste curso. Se você se identificar com JavaScript e evoluir em nossos cursos verá outras formas.

André, variáveis globais podem ser sobrescritas indevidamente por outro programa quando outro programa declara outra variável de mesmo nome no escopo global. Isso aqui foge do escopo desse treinamento, mas já que você perguntou vamos lá.

Você já aprendeu nos cursos da Alura a importar scripts? Isso porque neste curso de lógica não entro nesse mérito porque é algo muito exclusivo da linguagem JavaScript. Se sim, fica mais fácil entender o problema. Veja o código:

<!-- página index.html, por exemplo -->
<script src="a.js"></script>
<script src="b.js"></script>
<script>
   exibeNomePessoa(); // o que vai exibir?
</script>

Veja que a página importou dois scripts e eles são carregados na ordem em que foram definidos.

Agora vamos ao conteúdo de a.js:

// variável esta no escopo global
var nome = 'Flávio';
function exibeNomePessoa() {
  //  variável que esta no escopo global pode ser usada por exibeNomePessoa!
   alert(nome);
}

Agora vamos ao conteúdo de b.js:

// escopo global
var nome = 'Alura';
function exibeNomeEmpresa() {
   alert(nome);
}

Como b.js foi carregado depois de a.js, ele declarará a variável nome. Quem passa a valer agora é o valor da variável declarada em b.js, ou seja, gravou por cima de um valor no escopo global.

Agora, quando algume chamar exibeNomePessoa o valor será Alura e não Flávio.

A solução para problemas como esse não é de lógica de programação, mas domínio sólido da linguagem JavaScript. Você vê problemas como esse e solução nos cursos avançados de JavaScript da Alura.

Sendo assim, como disse, para quem esta começando no mundo da programação usar o escopo Global para compartilhar dados comuns entre funções é válido. Contudo, quando a pessoa sair da lógica de programação e quiser investir nos detalhes de uma linguagem verá que cada linguagem possui artifícios para contornar o problema do escopo global.

Mas Renato, a dúvida inicial, ficou sanada?

Obrigado pela explicação Flávio, agora consegui visualizar os problemas que podem ocorrer mais a frente. Desculpe por perguntar aqui, deveria ter criado outro tópico para não causar confusão com a pergunta do Renato.

Abraços!

Relaxa, está de boa. Renato foi sagaz na pergunta dele, essa explicação complementar não deve causar problemas.

Tudo certinho Renato?

Boa tarde, Flavio! Obrigado pelo retorno e atenção.

Sim, a dúvida foi esclarecida e os exemplos ajudaram ainda mais!

Parabéns pela didática e organização do treinamento, ficou excelente!

Abs, Renato

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software