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

Duvida do let em declaração global

Bom dia, quando declaro uma variável global (e se existe isso, pq ainda não vi o curso inteiro) eu declaro var ou let? Ou nesse caso não importa? Att.

2 respostas
solução!

Camila, a questão da variável global é uma questão de escopo. É um assunto extenso que vou tentar resumir.

Variável global é uma variável que está acessível a todo o código JS que for carregada depois dela ( isso conta outros documentos javascript carregados depois dela no HTML também ). Ela pode ser usada por qualquer método ou função dentro do código que for chamado depois dela também. Então, se um documento carregou as funções e métodos antes dessa variável, mas foi executado depois de carregar ela, então ela ainda estará visivel.

Respondendo sua pergunta: Tanto o var quanto o let podem ser variáveis globais (PONTO). O que muda é como o Javascript trata elas. O var é um modelo de variável "livre". Ou seja, você pode declarar ele duas vezes ou mais vezes e vai conseguir alterar o valor dela em todas as vezes que declarar.


var livre = 0; 
var livre = 50;
console.log(livre) // output 50
  
O let é um modelo de variável estrito. Você só pode declarar ele uma vez no código. Se voce tentar declarar duas vezes, você vai receber um erro no console do navegador

let estrito = 0;
let estrito = 50;
console.log(estrito)
/ Não executa o console.log e da output: 
Uncaught SyntaxError: Identifier 'teste' has already been declared
    at :1:1
/
Este comportamento tem um propósito: evitar a temida duplicação de variáveis. Isso é importante pois numa variável simples global, você corria o risco de alterar várias vezes pra passar nas outras funções e sem ter controle dela, os resultados das funções podem não ser os que você espera.

Exemplo clássico:

Você tem uma soma em uma função, mas recebe um texto e seu script retorna NAN

// copie e cole este codigo no seu console do navegador
//input recebido do usuario
var name = "meunome"
var multiplier = 50;

var number = 10; var multiplier = function(escope){ return name; }

var results = function(number, multiplier){ return number * multiplier }

console.log(results(number, multiplier))

//output: NAN

Perceba que eu, sem querer, alterei o multiplier pra uma string, explodindo minha aplicação em NAN

Se você jogar o mesmo código no console do navegador, trocando todos os var por let, você recebe este erro Uncaught SyntaxError: Identifier 'multiplier' has already been declared Perceba a importancia de não duplicar variáveis. - Segurança de declarar ela uma única vez - Ela só pode ser alterada ao chamar ela, nunca ao fazer uma nova declaração, o que reforça que você sabe o que está fazendo - Deixa seu código mais seguro

Antigamente, a gente conseguia esse mesmo efeito (ou parecido) fazendo uma IIFE ou colocando na cabeça do código o "use strict"

Como te falei é uma dúvida que exige uma explicação maior e até algumas leituras complementares. Na minha visão, entender os escopos do javascript é a coisa mais importante sobre o javascript, já que ele possui escopo dinâmico. Por isso estou deixando abaixo links de leitura recomendadíssima pra ajudar você.

Se isso não respondeu sua dúvida, pode perguntar de nvo, estarei aqui pra te ajudar

https://tableless.com.br/uma-visao-detalhada-sobre-instanciacao-de-variaveis-no-javascript/

http://www.matera.com/br/2017/05/09/javascript-6-diferenca-entre-var-let-e-const/

https://tableless.com.br/elevacao-ou-javascript-hoisting/

https://tableless.com.br/o-que-todo-dev-js-precisa-saber/

Essa de duplicação do let eu não sabia, no curso foi só dito que era para um bloco, interessante. Obrigada por responder até +.