严格模式是让JavaScript报错更早、行为更确定的执行开关,必须作为脚本或函数作用域内首个可执行语句以纯字符串字面量形式书写,能拦截拼错变量名、this绑定异常、误删系统属性等静默错误。

严格模式不是新语法,而是让 JavaScript 报错更早、行为更确定的“执行开关”——现在绝大多数现代项目已默认启用,但手动加 "use strict" 仍是你排查老代码、IIFE 或非模块化脚本时最有效的兜底手段。
怎么写才真正生效
它必须是脚本或函数作用域内第一个可执行语句,连空行和注释都得让路:
-
"use strict"必须是纯字符串字面量(双引号或单引号均可),不能带分号干扰(虽然加了也不报错,但语义不规范) - 全局启用:放在
.js文件第一行,前面不能有console.log()、var x = 1或任何表达式 - 函数级启用:
function foo() { "use strict"; ... }—— 必须是函数体内的第一行,箭头函数无法使用(无函数体) - 块级作用域里写
{ "use strict"; }是无效的,引擎直接忽略
它拦住哪些你以为“能跑通”的坑
很多低级错误在非严格模式下静默发生,直到上线才暴露:
本文档是python学习笔记与简明教程;为什么用Python作为编程入门语言?每种语言都会有它的支持者和反对者。去Google一下“why python”,你会得到很多结果,诸如应用范围广泛、开源、社区活跃、丰富的库、跨平台等等等等,也可能找到不少对它的批评,格式死板、效率低、国内用的人很少之类。不过这些优缺点的权衡都是程序员们的烦恼。作为一个想要学点编程入门的初学者来说,简单才是最重要的。当学C++的同学还在写链表,学Java的同学还在折腾运行环境的时候,学Pyt
- 拼错变量名:
usernmae = "jack"→ 非严格模式自动挂到window.usernmae;严格模式立刻抛ReferenceError: usernmae is not defined - this 绑定异常:
function foo() { console.log(this); }单独调用时,非严格模式输出window,严格模式输出undefined,帮你提前发现漏绑.bind()或该用箭头函数的地方 - 误删系统属性:
delete Object.prototype.toString在非严格模式返回false不报错;严格模式直接抛TypeError - 重复参数名:
function bar(a, a) { }在严格模式下是语法错误,而非只取第二个值
为什么现在还值得手动加
ES6 模块(import/export)、class、.mjs 文件确实默认严格,但这些场景仍需你主动加:
- 普通
标签加载的脚本(尤其老项目或 CMS 嵌入代码) - CommonJS 模块(Node.js 的
require()加载的.js文件) - IIFE 包裹的代码(如
(function(){ ... })();),打包后可能被合并导致顶部"use strict"失效 - 调试时想快速验证某段逻辑是否受严格约束,局部加一句最直接
最容易被忽略的一点:严格模式是词法继承的——一个严格函数里的嵌套函数,即使没写 "use strict",也自动处于严格模式;但反过来,非严格函数里的子函数不会“感染”成严格。所以别靠猜测,该加就加。









