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.