JavaScript 变量和 let / const 的学习笔记

写 JS 第一件事就是声明变量。教程里说现在别用 var,用 letconst,我一开始不明白为什么,直到自己踩了坑。

三者的区别

var a = 1;   // 老写法,作用域是整个函数,还能重复声明
let b = 2;   // 块级作用域,{} 里声明的外面拿不到
const c = 3; // 块级作用域,赋值后不能再换绑(不能重新赋值)

var 的坑:经典的循环问题

for (var i = 0; i < 3; i++) {
  setTimeout(function () {
    console.log(i); // 打印 3, 3, 3,不是 0, 1, 2
  }, 100);
}

for (let j = 0; j < 3; j++) {
  setTimeout(function () {
    console.log(j); // 正常打印 0, 1, 2
  }, 100);
}

因为 var 只有一个共享的 i,循环跑完它变成 3;而 let 每一轮都会创建一个新的 j。这个例子我抄下来跑了好几遍才真正理解。

const 不是"不能变"

一个容易误会的地方:const 阻止的是重新赋值,对象里面的内容还是能改的:

const list = [1, 2, 3];
list.push(4);      // 可以,数组内容变了
list = [5];        // 报错,不能重新赋值

我现在的习惯

默认全用 const,确定要重新赋值的才用 let(比如循环计数、累加器),var 基本不碰。这样代码意图更清楚——看到 const 就知道这个名字不会变。

小结

变量是 JS 的地基,理解作用域对后面写事件处理函数帮助很大,那个"点哪个都弹出 20"的坑本质上就是这里的问题。