必须分清var、let、const的行为差异:const优先用于不重赋值的绑定,支持对象属性修改但禁止重绑定;let提供块级作用域和TDZ;var存在函数作用域和提升;隐式全局变量危险且应禁用。

JavaScript 中变量声明和赋值不是“选哪种更好”,而是“必须分清 var、let、const 的行为差异”,否则会在作用域、重复声明、提升(hoisting)上踩坑。
什么时候该用 const 而不是 let
const 并不表示“值不可变”,而是“绑定不可重赋值”。只要不是立刻要重新赋值,就优先用 const —— 这能避免意外覆盖,也更利于静态分析。
- 函数参数、对象字面量、数组、正则表达式等,只要不打算写
foo = ...,就用const -
const声明必须初始化,const x;会直接报SyntaxError: Missing initializer in const declaration - 对象属性或数组元素仍可修改:
const arr = [1]; arr.push(2);合法;但arr = [];报错
let 和 var 在循环中表现完全不同
用 var 声明的循环变量在闭包中会捕获最后的值,而 let 每次迭代都绑定新绑定 —— 这是面试高频陷阱,也是实际异步回调出 bug 的根源。
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // 输出 3, 3, 3
}
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 0); // 输出 0, 1, 2
}
-
var有函数作用域 + 变量提升,let/const是块级作用域 + 暂时性死区(TDZ) -
typeof myLetVar在声明前会抛ReferenceError,而typeof myVar是"undefined"
隐式全局变量是危险的快捷方式
不声明直接赋值(如 counter = 1)会创建隐式全局变量,即使在严格模式下也会报错 —— 它绕过了所有作用域控制,极易污染全局、引发冲突。
无论从何种情形出发,在目前校长负责制的制度安排下,中小学校长作为学校的领导者、管理者和教育者,其管理水平对于学校发展的重要性都是不言而喻的。从这个角度看,建立科学的校长绩效评价体系以及拥有相对应的评估手段和工具,有利于教育行政机关针对校长的管理实践全过程及其结果进行测定与衡量,做出价值判断和评估,从而有利于强化学校教学管理,提升教学质量,并衍生带来校长转变管理观念,提升自身综合管理素质。
立即学习“Java免费学习笔记(深入)”;
- ESLint 规则
no-implicit-globals或no-undef可捕获这类写法 - 模块环境下(
type="module"或 ES module 文件),未声明赋值直接报ReferenceError -
浏览器中顶层
this.counter = 1看似等价,但语义混乱,不推荐
真正容易被忽略的是:const 和 let 在 if、for、try 块内声明后,外部无法访问 —— 很多人以为“没报错就是能用”,结果在块外读取时得到 ReferenceError,而不是 undefined。










