Avatar ·

Escopo de variáveis em JavaScript: var, let, const e funções

Olá a todos! Comecei a estudar JavaScript e não consigo entender o escopo de variáveis. Escrevo um código simples, mas os resultados sempre me surpreendem. Aqui está um exemplo: ```javascript var x = 10; function test() { var x = 20; if (true) { var x = 30; console.log(x); // imprime 30 } console.log(x); // imprime 30, não 20! } test(); console.log(x); // imprime 10 ``` Por que dentro da função `test()` a variável `x` muda, mesmo eu a declarando com `var` dentro do bloco `if`? Eu pensei que `var` era limitado à função, mas aqui ele se comporta de forma estranha. Também ouvi falar sobre `let` e `const`, mas não entendo como eles diferem. Outro exemplo com closures: ```javascript for (var i = 0; i < 3; i++) { setTimeout(function() { console.log(i); // imprime 3, 3, 3 }, 100); } ``` Por que todas as três chamadas mostram 3, e não 0, 1, 2? Eu esperava que cada chamada de setTimeout lembrasse seu próprio valor de i. Explique, por favor, como funciona.