如何理解JavaScript中的严格模式作用_JavaScript使用严格模式有哪些好处

发布时间 - 2026-01-08 00:00:00    点击率:
严格模式是执行约束开关,不改变语法能力但提升错误检测:未声明赋值报错、this为undefined、禁止with等;需首行声明,作用域限定于脚本或函数,ES6模块自动启用。

严格模式不是新语法,而是执行约束开关

它不改变 JavaScript 的能力,只改变引擎对代码的“容忍度”:原本静默忽略的问题,会直接报错。比如未声明就赋值——非严格模式下自动挂到 window 上;严格模式下立刻抛出 ReferenceError: username is not defined

  • 它是一条字面量语句:"use strict";,不是命令也不是函数调用,浏览器不支持时会被忽略(无副作用)
  • 作用域分两级:整个脚本顶部写,全局生效;函数体第一行写,仅该函数内生效
  • ES6 模块(.mjsimport/export 文件)和 class 内部自动启用严格模式,无需手动加

哪些错误会被提前暴露?重点看这三类典型场景

严格模式真正价值在于把“运行时才崩”的问题,变成“一写就报错”或“一跑就停”,大幅缩短调试链路。

  • 隐式全局变量count = 42; 在非严格模式下创建 window.count;严格模式下直接报错
  • this 绑定更可控:普通函数独立调用时,thisundefined 而非 window,避免意外修改全局对象
  • 非法操作显式失败:给不可写属性赋值、删除不可配置属性、重复定义对象键名({x:1, x:2})、重复函数参数(function foo(a, a) {})都会立即报 TypeError 或语法错误

为什么现在还要手动加"use strict"?

虽然现代构建工具(如 Webpack、Vite)和模块系统默认启用,但仍有真实场景依赖显式声明:

  • 老项目中大量 .js 文件未转模块,仍走 script 标签加载,必须靠 "use strict"; 触发
  • 某些库源码(如早期版本的 Lodash、jQuery 插件)会在 IIFE 开头手动开启,以保证内部逻辑安全
  • 调试时临时加在某段函数里,快速验证是否因非严格行为导致异常(比如 arguments.callee 被禁用)
  • 注意:不能写在条件语句里——if (true) {"use strict";} 无效,必须是脚本/函数的**物理首行**
"use strict";
function test() {
  "use strict";
  undeclared = "boom"; // ReferenceError
  this.x = 1;           // 正常,因为 this 是 undefined,赋值被忽略(但不会报错)
  return this;
}
test(); // 返回 undefined,而非 window

容易被忽略的兼容性与限制细节

严格模式不是万能补丁,有些行为变化反而会让旧代码直接失效,上线前必须验证:

  • with 语句被完全禁止,任何含 with(obj) { ... } 的代码会直接 SyntaxError
  • 八进制字面量(010)非法,必须写成 0o100x10
  • eval 变得更干净:它内部声明的变量不会泄露到外层作用域,但也不能通过 eval 动态创建函数参数或函数名
  • 某些保留字(classenumexportimportsuper)在严格模式下不能再当变量名,否则 SyntaxError
严格模式的价值不在“多做了什么”,而在“少容忍了什么”。最常踩的坑,其实是忘了它只对**紧邻作用域**生效——一个文件里写了,不代表所有 import 进来的模块也受约束;一个函数开了,不代表它的回调函数自动继承。这点在混合使用 CommonJS 和动态 eval 时尤其容易翻车。


# javascript  # es6  # java  # jquery  # js  # vite  # 浏览器  # 回调函数  # 工具  # win  # 作用域  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  历史网站制作软件,华为如何找回被删除的网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  青岛网站建设如何选择本地服务器?  免费视频制作网站,更新又快又好的免费电影网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何在万网主机上快速搭建网站?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  深圳网站制作的公司有哪些,dido官方网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何实现一对一模型关联?(Eloquent示例)  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Python文件异常处理策略_健壮性说明【指导】  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel如何使用Livewire构建动态组件?(入门代码)  如何用免费手机建站系统零基础打造专业网站?  Android使用GridView实现日历的简单功能  创业网站制作流程,创业网站可靠吗?  如何在阿里云香港服务器快速搭建网站?  *服务器网站为何频现安全漏洞?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Android 常见的图片加载框架详细介绍  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  香港服务器建站指南:免备案优势与SEO优化技巧全解析  网易LOFTER官网链接 老福特网页版登录地址  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何用低价快速搭建高质量网站?  如何快速重置建站主机并恢复默认配置?  手机网站制作与建设方案,手机网站如何建设?  Laravel怎么使用Intervention Image库处理图片上传和缩放  MySQL查询结果复制到新表的方法(更新、插入)  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Firefox Developer Edition开发者版本入口  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在宝塔面板创建新站点?  EditPlus 正则表达式 实战(3)