什么是javascript严格模式_它如何帮助你写出更安全的代码

发布时间 - 2026-01-11 00:00:00    点击率:
严格模式是一组更严格的解析和执行规则,启用后使危险代码直接报错以暴露潜在问题;需用"use strict"字面量在脚本顶部或函数首行声明,禁用静默失败、with语句、重复参数等,并使非函数上下文中this为undefined。

JavaScript 严格模式不是语法糖,也不是新语言,而是一组更严格的解析和执行规则——启用后,原本“能跑但危险”的代码会直接报错,逼你暴露并修复潜在问题。

如何启用严格模式

严格模式必须通过字面量字符串 "use strict" 声明,且必须出现在脚本顶部或函数体第一行(否则无效)。

"use strict";
function foo() {
  "use strict"; // 函数级严格模式
  // ...
}
  • 全局启用:整个脚本文件第一行是 "use strict",所有代码受约束
  • 函数级启用:只对当前函数及其嵌套作用域生效,不影响外部
  • 不能用条件语句包裹:if (true) { "use strict"; } 完全无效
  • 模块(.mjsimport 加载的脚本)默认启用严格模式,无需手动声明

严格模式禁止的常见危险操作

它不新增功能,而是封掉容易引发 bug 的旧习,比如静默失败、意外全局变量、模糊的 this 绑定。

  • 给未声明变量赋值会报 ReferenceError(而不是自动挂到 window 上)
  • with 语句被完全禁用——它破坏作用域链,让静态分析失效
  • 函数参数名重复(如 function f(a, a) {})触发 SyntaxError
  • 八进制字面量(如 010)被禁止,避免歧义;必须写成 0o10
  • delete 不能用于变量、函数、参数,只能删对象自有属性(否则报 TypeError
  • 在非函数上下文中,this 不再指向全局对象,而是 undefined(防止意外修改全局)

严格模式下 this 行为的变化

这是最容易踩坑的一点:非严格模式中,独立调用函数时 this 指向全局对象(windowglobalThis),而严格模式下是 undefined

"use strict";
function foo() {
  console.log(this); // undefined
}
foo(); // 而不是 window
  • 箭头函数不受影响(它本就不绑定 this
  • 类方法、对象方法、call/apply/bind 显式传入的 this 仍正常工作
  • 这个变化让 this 绑定更可预测,也更容易发现忘记绑定的事件处理器或回调

严格模式不是万能的,但它能暴露真问题

它不会阻止逻辑错误,也不会帮你防 XSS 或类型错误,但它强制你面对 JavaScript 中那些“靠运气运行”的灰色地带。比如,你写 delete obj.x 却没检查 obj 是否存在,在非严格模式下可能静默失败;而在严格模式下,如果 objundefined,会立刻抛出 TypeError,让你知道该加空值检查了。

真正容易被忽略的是:严格模式只对**当前作用域**有效,且无法“继承”——子函数不会自动严格,除非自己也写了 "use strict"。混用严格与非严格代码时,边界处的行为差异尤其需要留心。


# javascript  # java  # js  # 处理器  # app  # win  # 作用域 


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


相关推荐: 如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  网站建设保证美观性,需要考虑的几点问题!  详解Oracle修改字段类型方法总结  图册素材网站设计制作软件,图册的导出方式有几种?  php485函数参数是什么意思_php485各参数详细说明【介绍】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Internet Explorer官网直接进入 IE浏览器在线体验版网址  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何快速搭建高效香港服务器网站?  昵图网官方站入口 昵图网素材图库官网入口  如何获取PHP WAP自助建站系统源码?  JS实现鼠标移上去显示图片或微信二维码  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  EditPlus 正则表达式 实战(3)  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  详解MySQL数据库的安装与密码配置  Swift中switch语句区间和元组模式匹配  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何快速上传自定义模板至建站之星?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  JavaScript如何操作视频_媒体API怎么控制播放  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  浅谈redis在项目中的应用  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  千库网官网入口推荐 千库网设计创意平台入口  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel怎么在Blade中安全地输出原始HTML内容  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  如何在腾讯云免费申请建站?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  大学网站设计制作软件有哪些,如何将网站制作成自己app?  手机软键盘弹出时影响布局的解决方法  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  微信小程序 配置文件详细介绍  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何快速选择适合个人网站的云服务器配置?  如何有效防御Web建站篡改攻击?  韩国服务器如何优化跨境访问实现高效连接?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程