JavaScript严格模式本身不提供限制变量修改的语法机制,真正限制靠属性描述符和作用域控制;它仅强化Object.freeze、const、defineProperty等机制的报错及时性与可靠性。

JavaScript 严格模式本身不提供“限制特定变量修改”的语法机制,它不会帮你锁定某个变量不让改——它只强制你遵守更规范的规则。真正限制变量修改,靠的是 属性描述符 和 作用域控制,严格模式只是让这些限制更可靠、报错更及时。
用 Object.defineProperty 或 Object.freeze 锁定对象属性
严格模式下,对已定义为只读(writable: false)或不可配置(configurable: false)的属性赋值,会立刻抛出 TypeError,而非静默失败:
- 给只读属性赋新值 → 报
TypeError: Cannot assign to read only property - 尝试删除不可配置属性 → 报
TypeError: Cannot delete property - 对已冻结对象添加/修改属性 → 直接报错(非静默忽略)
示例:
"use strict";
const obj = {};
Object.defineProperty(obj, "PI", {
value: 3.14159,
writable: false,
enumerable: true,
configurable: false
});
obj.PI = 3; // ❌ TypeError:严格模式下立即报错
用 const 声明基本类型变量,天然防重赋值
const 声明的变量不能重新赋值(注意:对对象/数组本身内容的修改仍允许):
-
const count = 10;→count = 20;报TypeError -
const arr = [];→arr.push(1);合法(改内容),但arr = [2];报错(改引用) - 严格模式强化了这个行为的一致性,避免非严格模式下某些引擎的宽松处理
结合闭包 + 私有变量模拟“只读”效果
把变量放在函数作用域内,只暴露取值方法,不暴露赋值入口:
- 外部无法直接访问变量,只能通过返回的 getter 方法读取
- 即使在严格模式下,这种封装也从源头杜绝了意外修改
- 适合需要逻辑校验或副作用控制的场景(比如计数器、配置项)
示例:
"use strict";
function createReadOnly(value) {
return {
get() { return value; }
};
}
const version = createReadOnly("v2.1");
console.log(version.get()); // "v2.1"
// version.get = () => "hack"; // ❌ 不影响原始值,且无 setter 可写
配合严格模式启用,让错误暴露得更早
严格模式不是“锁变量”的工具,而是“放大器”:
- 没加
"use strict"时,对只读属性赋值可能被忽略(静默失败) - 加上后,同一行代码立刻中断并提示错误,便于调试和维护
- 它确保
Object.freeze()、const、defineProperty的限制真正生效,而不是形同虚设
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











