JavaScript严格模式是什么_它如何提高代码质量

云晨姑娘_9874

云晨姑娘_9874

2026-01-10

987人浏览

原创

严格模式开启后,未声明变量赋值、delete不可配置属性、函数参数重复、八进制字面量、非对象调用this为undefined等行为会直接报错。

javascript严格模式是什么_它如何提高代码质量

严格模式开启后,哪些常见错误会直接报错

严格模式不是语法糖,而是让 JavaScript 引擎切换到更严格的解析和执行模式。它会让原本静默失败的行为变成显式错误,比如给未声明变量赋值:foo = 1 在非严格模式下会自动创建全局变量,但在严格模式下直接抛出 ReferenceError: foo is not defined。

其他典型报错场景包括:

  • delete 操作符删除不可配置属性(如 delete Object.prototype)→ TypeError
  • 函数参数名重复(function f(a, a) { })→ SyntaxError
  • 使用八进制字面量(010)→ SyntaxError(ES5 严格模式不支持)
  • this 在非对象上下文中为 undefined(而非自动绑定到 window)

如何正确启用严格模式:位置和作用域影响

严格模式必须通过字面量字符串 "use strict" 启用,且只能出现在脚本顶部或函数体第一行(前面不能有可执行语句)。位置错误会导致失效:

"use strict";
console.log(this); // this === undefined

如果写在函数中间:

function f() {
  console.log(1);
  "use strict"; // ❌ 无效,不会进入严格模式
}

作用域上,严格模式是**函数级**的,不是块级。这意味着:

Java Development Man
Java Development Man

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。

下载
  • 整个脚本加 "use strict" → 全局严格模式
  • 只在某个函数内加 → 仅该函数及其内部函数受严格约束
  • 箭头函数继承外层严格状态,不单独声明

严格模式修复的隐蔽陷阱:this、arguments 和 eval

这些是容易被忽略但影响深远的点:

  • this 不再自动装箱:普通函数调用时 this 是 undefined,而不是 window 或 globalThis,避免意外污染全局
  • arguments 对象不再与形参同步:修改 arguments[0] 不会改变对应参数值,消除副作用
  • eval 不能在当前作用域创建变量:在严格模式中,eval("var x = 1") 的 x 只存在于 eval 内部,不会泄漏到外层
  • 禁止使用 with 语句:因为它动态改变作用域链,使静态分析失效,且性能差

现代开发中是否还需要手动加"use strict"

不需要主动添加——主流打包工具(Webpack、Vite、Rollup)和现代 JS 环境默认启用严格模式。ES6 模块(.mjs 文件或 type="module" 的 <script></script>)自动处于严格模式,无需声明。

但仍有几个关键例外必须注意:

  • CommonJS 模块(Node.js 的 .cjs 或 require() 加载的文件)仍需手动加 "use strict"
  • 内联 <script></script> 标签默认是非严格模式,除非显式声明或设为模块
  • 某些老旧构建流程可能未启用严格模式,导致 arguments.callee 等禁用特性仍能运行(但已不推荐)

真正容易被忽略的是:即使你没写 "use strict",也别假设非严格行为还存在;很多引擎对非严格代码的兼容性正在收缩,尤其是涉及 eval、arguments 和 with 的逻辑,越早按严格模式写,越少踩 runtime 隐患。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

305

5

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

406

5

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.24

395

12

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

2023.11.27

1975

6

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.18

5365

12

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2025.09.18

2290

13

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

2026.03.17

219

17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3204

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习