严格模式是JavaScript的限制性变体,通过"use strict"启用,使错误显式化、禁用危险语法、改变this和eval行为,提升代码可预测性与安全性。

JavaScript 严格模式不是新语言,而是对 JavaScript 解析和执行的限制性变体——启用后会抛出更多错误、禁用危险语法、让代码行为更可预测。它不改变语法结构,但改变了 eval、this、变量声明、重复属性等的处理方式。
如何在脚本或函数中启用严格模式
严格模式必须通过字面量字符串 "use strict" 启用,且必须出现在脚本顶部(全局作用域)或函数体第一行(函数作用域)。任何前置语句(包括空行、注释、分号)都会导致失效。
- 全局启用:
"use strict";\nconsole.log(this); // 全局中 this 为 undefined
- 函数级启用:
function foo() {\n "use strict";\n arguments[0] = 123; // 会报错:不能修改 arguments 值\n} - 错误写法(被忽略):
console.log("hello");\n"use strict"; // 不生效
严格模式下哪些常见操作会报错
它把原本静默失败的行为变成显式错误,帮你提前发现隐患:
-
with语句被完全禁止,使用即 SyntaxError - 给只读属性赋值(如
NaN = 1或Object.defineProperty(obj, "x", {writable: false})后再改)抛出 TypeError - 删除不可配置属性(
delete obj.x)抛出 TypeError,而非静默返回 false - 函数参数名重复(
function f(a, a) {})在严格模式下是 SyntaxError -
arguments.callee和arguments.caller被禁用,访问即 TypeError
严格模式对 this 和 eval 的影响
这是最容易踩坑的两个点,尤其在封装工具函数或处理回调时:
本文档是python学习笔记与简明教程;为什么用Python作为编程入门语言?每种语言都会有它的支持者和反对者。去Google一下“why python”,你会得到很多结果,诸如应用范围广泛、开源、社区活跃、丰富的库、跨平台等等等等,也可能找到不少对它的批评,格式死板、效率低、国内用的人很少之类。不过这些优缺点的权衡都是程序员们的烦恼。作为一个想要学点编程入门的初学者来说,简单才是最重要的。当学C++的同学还在写链表,学Java的同学还在折腾运行环境的时候,学Pyt
立即学习“Java免费学习笔记(深入)”;
- 非严格模式下,独立调用函数时
this指向全局对象(window或globalThis);严格模式下为undefined—— 这意味着foo()中的this.x = 1会直接报错,而不是意外污染全局 -
eval在严格模式下不创建新变量到外层作用域:"use strict";\neval("var x = 1");\nconsole.log(x); // ReferenceError: x is not defined - 严格模式中,
eval内部声明的函数不会提升到外层,也不会泄漏变量名
严格模式不是“向后兼容补丁”,它的约束是硬性的。现代项目普遍默认启用(例如通过打包工具或 ES 模块自动开启),但手写脚本时仍需手动加 "use strict" 并注意位置。最常被忽略的是:模块(.mjs 或 type="module")默认就是严格模式,此时再写 "use strict" 虽无害但冗余。










