Avatar ·

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值。请解释一下这是如何工作的。