JavaScript 严格模式(use strict)(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
JavaScript 作为一门灵活且强大的动态语言,在赋予开发者高度自由的同时,也带来了潜在的代码隐患。例如,变量未声明就使用、意外修改全局对象等行为,可能导致难以调试的 bug。为了帮助开发者编写更安全、规范的代码,JavaScript 引入了 严格模式(use strict)。本文将深入解析严格模式的核心机制、使用场景及实际案例,帮助读者逐步掌握这一工具,提升代码质量。
严格模式的定义与作用
什么是严格模式?
严格模式(Strict Mode)是 JavaScript 的一种运行模式,通过在代码开头添加 “use strict”;
声明,可以启用该模式。它通过限制某些语法行为、强制规范编码习惯,从而减少潜在的错误。
可以将其理解为一位“严格的老师”:在非严格模式下,代码可能因 JavaScript 的宽松规则而“侥幸通过”,但在严格模式下,这些“投机取巧”的行为会被直接禁止,例如:
- 禁止未声明的变量
- 禁止修改不可配置的属性
- 限制
this
的默认行为
严格模式的核心作用
- 增强安全性:通过禁止危险操作(如意外覆盖全局变量),降低代码漏洞风险。
- 规范化编码:强制开发者遵循最佳实践,例如避免使用保留关键字作为变量名。
- 提升性能:部分引擎在严格模式下能进行更高效的优化(例如更精准的变量查找)。
如何启用严格模式?
严格模式的启用方式有两种,需根据代码的上下文选择:
1. 函数作用域启用
在函数内部添加 “use strict”;
声明,仅对当前函数生效:
function strictFunction() {
"use strict";
// 该函数内的代码遵循严格模式
// 例如,这里尝试未声明的变量会直接报错
// myVariable = 10; // 抛出 ReferenceError
}
比喻:这就像为函数穿上一件“防护外套”,仅在函数内部生效,不影响外部代码。
2. 全局作用域启用
在脚本或模块的顶部添加 “use strict”;
,则整个文件或模块进入严格模式:
"use strict";
// 整个文件内的代码遵循严格模式
// 例如,这里无法意外修改全局对象
this意外修改 = "无效操作"; // 抛出 TypeError
注意:在浏览器环境下,全局严格模式仅对当前脚本有效;而在 Node.js 中,需在文件开头声明。
严格模式的关键变化与案例分析
严格模式通过以下核心规则,强制开发者编写更严谨的代码:
1. 禁止未声明的变量
在非严格模式下,未声明的变量会被自动提升为全局变量,这可能导致意外覆盖或内存泄漏。严格模式强制要求显式声明变量:
// 非严格模式
function nonStrict() {
myVar = "意外全局变量"; // 未声明变量自动成为全局属性
}
nonStrict();
console.log(window.myVar); // 输出:"意外全局变量"
// 严格模式
function strict() {
"use strict";
myVar = "尝试赋值"; // 抛出 ReferenceError
}
比喻:这如同银行账户的“强制密码验证”——未声明的变量就像未授权的转账,直接被系统拦截。
2. 禁止修改不可配置的属性
严格模式禁止修改某些内置对象或不可配置的属性,防止意外破坏系统行为:
"use strict";
Object.defineProperty(window, "myProp", {
configurable: false,
value: "原始值"
});
// 尝试重新定义属性
Object.defineProperty(window, "myProp", { value: "新值" });
// 抛出 TypeError: Cannot redefine property: myProp
3. 限制 this
的默认行为
在非严格模式下,函数内部的 this
可能指向全局对象(浏览器中为 window
)。严格模式中,若未通过 call()
、apply()
或 bind()
明确绑定,this
的值将为 undefined
:
function logThis() {
"use strict";
console.log(this); // 输出: undefined
}
logThis(); // 非严格模式下输出 window,严格模式下为 undefined
案例:在对象方法中,严格模式能避免 this
指向错误:
const obj = {
"use strict"; // 注意:此处语法错误!严格模式需在函数或全局作用域声明
count: 0,
increment: function() {
"use strict";
this.count += 1; // 若 this 未绑定,会抛出错误
}
};
// 错误用法:this 指向 undefined
obj.increment.call(undefined); // 抛出 TypeError
4. 禁止删除变量或函数
严格模式禁止通过 delete
操作符删除变量、函数或参数:
"use strict";
function testFunc() {}
delete testFunc; // 抛出 SyntaxError
delete arguments; // 抛出 TypeError
5. 禁止保留关键字作为标识符
严格模式禁止使用 JavaScript 的保留关键字(如 class
、enum
)作为变量名,避免未来语法升级的冲突:
"use strict";
var class = "错误变量名"; // 抛出 SyntaxError
实际应用场景与最佳实践
场景 1:避免全局污染
// 非严格模式下:
function add(a, b) {
result = a + b; // 未声明变量自动成为全局变量
}
add(2, 3);
console.log(window.result); // 5
// 严格模式强制显式声明:
function addStrict(a, b) {
"use strict";
const result = a + b; // 必须声明变量
return result;
}
场景 2:防止对象方法中的 this
问题
const calculator = {
value: 0,
increment() {
"use strict";
// 若通过事件监听调用,需绑定 this
this.value += 1;
}
};
// 错误用法:
document.querySelector("button").addEventListener("click", calculator.increment);
// 点击按钮时 this 为 undefined,抛出错误
// 正确用法:
document.querySelector("button").addEventListener("click", calculator.increment.bind(calculator));
场景 3:模块化代码中全局启用严格模式
// 在模块文件顶部添加严格模式声明:
"use strict";
export function multiply(a, b) {
return a * b;
}
// 整个模块内的代码均遵循严格规则
常见误区与解决方案
误区 1:全局严格模式影响其他脚本
严格模式仅对当前脚本或模块生效,不会污染外部代码:
// 脚本 A(全局严格模式)
"use strict";
// ...
// 脚本 B(未启用严格模式)
// 可以正常使用非严格模式语法
误区 2:函数作用域严格模式无法嵌套
严格模式在函数内部声明后,其嵌套的函数会继承该模式:
function outer() {
"use strict";
function inner() {
// 自动处于严格模式
undeclaredVar = 10; // 抛出 ReferenceError
}
inner();
}
误区 3:ES6+ 代码自动启用严格模式
ES6 模块(使用 export
或 import
)会默认启用严格模式,无需显式声明:
// 这个 ES6 模块自动处于严格模式
export default class MyClass {
constructor() {
undeclaredVar = "无效赋值"; // 直接报错
}
}
结论
JavaScript 严格模式(use strict)是开发者编写健壮、可维护代码的利器。通过禁止危险操作、强制规范编码习惯,它帮助开发者提前发现潜在问题,减少运行时错误。无论是函数级别的局部使用,还是全局或模块级别的全面启用,严格模式都能显著提升代码质量。
对于初学者,建议从函数作用域内逐步使用严格模式,熟悉其规则后再扩展到全局场景;中级开发者则可结合项目需求,全面启用严格模式并优化代码结构。随着 JavaScript 的发展,严格模式已成为现代代码实践的标配,掌握它将为构建高质量应用奠定坚实基础。
提示:在使用严格模式时,可通过浏览器开发者工具或 Node.js 的
--use-strict
参数辅助调试,快速定位不符合规范的代码。