什么是javascript中的严格模式?_启用严格模式会带来哪些变化?【教程】

9次阅读

严格模式javaScript的限制性变体,启用后使“能跑但不对”的代码直接报错;需置于脚本或函数体第一行(仅允许前置注释或空行),模块默认启用;禁用未声明变量、只读属性赋值、delete不可配置属性、重复参数、八进制字面量;this在全局函数中为undefined而非window,提升可靠性。

什么是javascript中的严格模式?_启用严格模式会带来哪些变化?【教程】

javascript 严格模式不是新语言,而是对 JavaScript 解析和执行的限制性变体——启用后,原本“能跑但不对”的代码会直接报错,帮你提前暴露隐患。

如何启用严格模式?"use strict" 放哪儿才生效?

必须是脚本或函数体内的**第一行可执行语句**(前面只能有注释或空行),否则无效:

"use strict"; function foo() {   // ✅ 全局严格模式 }

或只在函数内启用:

function bar() {   "use strict";   // ✅ 仅此函数内启用 }
  • 如果写在 if 块、循环里,或前面有变量声明(如 var x = 1; "use strict";),会被忽略
  • 模块(.mjsimport 加载的脚本)默认就是严格模式,无需手动加
  • 箭头函数不支持单独启用严格模式,它继承外层作用域的严格状态

哪些常见写法在严格模式下会直接报错?

严格模式禁用大量“宽松历史遗留行为”,典型报错包括:

立即学习Java免费学习笔记(深入)”;

  • ReferenceError:使用未声明变量,如 foo = 123;(非严格下会自动挂到 window
  • SyntaxError:给只读属性赋值,如 Object.defineProperty(obj, "x", {writable: false}); obj.x = 1;
  • SyntaxError:删除不可配置属性,如 delete Object.prototype.toString;
  • TypeError:函数参数名重复,如 function f(a, a) {}
  • TypeError:八进制字面量(010),必须写成 0o100x10

严格模式下 this 的行为为什么更可靠?

非严格模式中,全局函数调用时 this 指向 window浏览器)或 globalnode.js),容易引发隐式绑定错误;严格模式下统一为 undefined

function test() {   "use strict";   console.log(this); // undefined,而非 window } test(); // ✅ 明确提示你可能漏了绑定
  • 避免意外污染全局对象
  • call/apply/bind 和箭头函数的 this 行为更可预测
  • 类方法中若忘记绑定,直接报错而非静默失败

严格模式真正的价值不在“多报几个错”,而在于它强制你面对 JavaScript 中那些模糊、易错、跨环境不一致的边界情况——比如 with 被完全禁用,arguments.callee 不可用,这些都不是“少用就好”,而是从语法层就切断歧义路径。实际项目中,建议所有新文件默认启用,老代码迁移时重点检查动态赋值、eval 使用和 this 绑定逻辑。

text=ZqhQzanResources