JavaScript 严格模式(use strict)(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

JavaScript 作为一门灵活且强大的动态语言,在赋予开发者高度自由的同时,也带来了潜在的代码隐患。例如,变量未声明就使用、意外修改全局对象等行为,可能导致难以调试的 bug。为了帮助开发者编写更安全、规范的代码,JavaScript 引入了 严格模式(use strict)。本文将深入解析严格模式的核心机制、使用场景及实际案例,帮助读者逐步掌握这一工具,提升代码质量。


严格模式的定义与作用

什么是严格模式?

严格模式(Strict Mode)是 JavaScript 的一种运行模式,通过在代码开头添加 “use strict”; 声明,可以启用该模式。它通过限制某些语法行为、强制规范编码习惯,从而减少潜在的错误。

可以将其理解为一位“严格的老师”:在非严格模式下,代码可能因 JavaScript 的宽松规则而“侥幸通过”,但在严格模式下,这些“投机取巧”的行为会被直接禁止,例如:

  • 禁止未声明的变量
  • 禁止修改不可配置的属性
  • 限制 this 的默认行为

严格模式的核心作用

  1. 增强安全性:通过禁止危险操作(如意外覆盖全局变量),降低代码漏洞风险。
  2. 规范化编码:强制开发者遵循最佳实践,例如避免使用保留关键字作为变量名。
  3. 提升性能:部分引擎在严格模式下能进行更高效的优化(例如更精准的变量查找)。

如何启用严格模式?

严格模式的启用方式有两种,需根据代码的上下文选择:

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 的保留关键字(如 classenum)作为变量名,避免未来语法升级的冲突:

"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 模块(使用 exportimport)会默认启用严格模式,无需显式声明:

// 这个 ES6 模块自动处于严格模式  
export default class MyClass {  
  constructor() {  
    undeclaredVar = "无效赋值"; // 直接报错  
  }  
}  

结论

JavaScript 严格模式(use strict)是开发者编写健壮、可维护代码的利器。通过禁止危险操作、强制规范编码习惯,它帮助开发者提前发现潜在问题,减少运行时错误。无论是函数级别的局部使用,还是全局或模块级别的全面启用,严格模式都能显著提升代码质量。

对于初学者,建议从函数作用域内逐步使用严格模式,熟悉其规则后再扩展到全局场景;中级开发者则可结合项目需求,全面启用严格模式并优化代码结构。随着 JavaScript 的发展,严格模式已成为现代代码实践的标配,掌握它将为构建高质量应用奠定坚实基础。

提示:在使用严格模式时,可通过浏览器开发者工具或 Node.js 的 --use-strict 参数辅助调试,快速定位不符合规范的代码。

最新发布