javascript严格模式是什么_它能解决哪些潜在问题?
发布时间 - 2026-01-08 00:00:00 点击率:次严格模式强制变量声明、禁用隐式全局变量、使this在非对象调用时为undefined、禁止arguments.callee等不安全语法,并隔离eval和arguments作用域。
严格模式开启后变量必须声明才能使用
不加 "use strict" 时,给未声明的变量赋值会自动创建全局变量,容易污染全局作用域、掩盖拼写错误。开启后直接报 ReferenceError。
常见错误现象:name = "Alice" 在非函数作用域或普通函数中执行,没报错但悄悄挂到 window.name(浏览器)或 global.name(Node.js)上。
实操建议:
- 在脚本顶部或函数体第一行写
"use strict"(注意:必须是字符串字面量,且不能有前置语句) - 避免在
with块内启用严格模式(语法不允许) - 模块(
.mjs或import/export的文件)默认启用严格模式,无需手动加
禁止静默失败的赋值操作
严格模式让原本“看似成功”的非法操作立刻抛错,比如给不可写属性赋值、给只读全局对象(如 undefined、NaN、Infinity)重新赋值、删除不可配置属性等。
典型错误示例:delete Object.prototype 在非严格模式下返回 false 却不报错;严格模式下直接抛 TypeError。
实操建议:
- 检查旧代码中是否依赖
delete返回布尔值做判断——严格模式下该行为不可靠 -
this在非对象上下文(如普通函数调用)中不再绑定到全局对象,而是undefined,避免意外修改全局状态 - 避免在构造函数外使用
new.target,它在严格/非严格下行为一致,但仅在严格模式下对箭头函数有效(实际箭头函数无new.target)
限制存在安全隐患或易混淆的语法
严格模式禁用了一些歧义大、维护性差或已被废弃的特性,例如:
常见被禁用项:
-
arguments.callee和arguments.caller—— 无法再通过arguments反向获取函数本身,消除递归匿名函数的隐式依赖 - 八进制字面量(如
010)—— 改为必须写0o10或0x10,避免数字开头零引发误解 - 函数参数名重复(
function foo(a, a) { })—— 严格模式下直接语法错误,非严格模式仅保留最后一个值 -
eval和arguments不能作为标识符(var eval = 1报错)
这些限制不是为了“多此一举”,而是让代码行为更可预测、更容易被静态分析工具识别问题。
严格模式对 eval 和 arguments 的隔离更彻底
非严格模式下,eval 内部声明的变量会泄漏到外层作用域;arguments 对象与形参保持“双向绑定”(改 arguments[0] 会同步影响 a)。
严格模式切断这两类隐式耦合:
-
eval("var x = 1"); console.log(x);→ 报ReferenceError(x不泄露) function foo(a) { "use strict"; arguments[0] = 2; console.log(a); // 仍输出原值,如传入 1 则输出 1 }
这点在调试或重构带 eval 的老代码时特别关键——你不能再假设 eval 是“作用域黑洞”,它现在真正沙箱化了。
严格模式不是银弹,但它把很多“运行时不报错却逻辑错”的坑提前暴露出来。最容易被忽略的是:模块默认严格、IIFE 中漏写 "use strict" 导致子作用域仍处于宽松状态、以及第三方库未启用时带来的行为不一致。上线前用 ESLint 开启 strict 规则或检查打包产物是否保留了严格指令,比运行时靠运气发现更可靠。
# javascript
# java
# js
# node.js
# node
# 浏览器
# 工具
# win
# 作用域
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
*服务器网站为何频现安全漏洞?
香港服务器WordPress建站指南:SEO优化与高效部署策略
详解jQuery中的事件
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
如何用wdcp快速搭建高效网站?
如何快速选择适合个人网站的云服务器配置?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Swift中循环语句中的转移语句 break 和 continue
如何在宝塔面板创建新站点?
iOS发送验证码倒计时应用
Laravel如何升级到最新版本?(升级指南和步骤)
活动邀请函制作网站有哪些,活动邀请函文案?
如何用VPS主机快速搭建个人网站?
JavaScript如何实现继承_有哪些常用方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Linux后台任务运行方法_nohup与&使用技巧【技巧】
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何在万网自助建站中设置域名及备案?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
JavaScript Ajax实现异步通信
如何用PHP工具快速搭建高效网站?
制作企业网站建设方案,怎样建设一个公司网站?
大连 网站制作,大连天途有线官网?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
如何在腾讯云服务器快速搭建个人网站?
EditPlus中的正则表达式实战(6)
简单实现Android验证码
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
利用vue写todolist单页应用
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
PHP正则匹配日期和时间(时间戳转换)的实例代码
EditPlus中的正则表达式 实战(1)
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何使用Livewire构建动态组件?(入门代码)
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
高防服务器如何保障网站安全无虞?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
phpredis提高消息队列的实时性方法(推荐)
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何用腾讯建站主机快速创建免费网站?
python中快速进行多个字符替换的方法小结
微信小程序 require机制详解及实例代码
C#如何调用原生C++ COM对象详解

