JavaScript中变量的作用域:var、let、const与函数
大家好!我刚开始学习JavaScript,一直搞不清楚变量的作用域。我写了一些简单的代码,但结果总是让我惊讶。
下面是一个例子:
```javascript
var x = 10;
function test() {
var x = 20;
if (true) {
var x = 30;
console.log(x); // 输出30
}
console.log(x); // 输出30,而不是20!
}
test();
console.log(x); // 输出10
```
为什么在函数`test()`内部,变量`x`会改变,尽管我用`var`在`if`块内声明了它?我以为`var`的作用域是函数级别的,但这里它的行为很奇怪。我还听说过`let`和`const`,但不知道它们有什么区别。
另一个关于闭包的例子:
```javascript
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // 输出3, 3, 3
}, 100);
}
```
为什么三个调用都显示3,而不是0、1、2?我原以为每个setTimeout调用会记住自己的i值。请解释一下这是如何工作的。