严格模式下this为undefined,可避免全局污染;需在函数内显式声明"use strict",箭头函数天然安全,应优先使用bind/call/apply显式绑定或改用闭包、参数传递替代this依赖。

在严格模式下,this 不再默认绑定到全局对象(如浏览器中的 window 或 Node.js 中的 global),而是为 undefined。这本身就能规避全局污染——但关键在于:你得确保函数确实运行在严格模式下,且不依赖隐式绑定。
确保函数体处于严格模式
仅在脚本顶部写 "use strict" 并不能保证所有函数都受其影响,尤其当函数是动态生成或被其他上下文调用时。最稳妥的方式是在函数内部显式声明:
- 普通函数:在函数体第一行加
"use strict" - 箭头函数:不绑定
this,自动沿用外层词法作用域,天然安全(但要注意它不解决“调用时this丢失”的问题) - 类方法、模块顶层代码默认启用严格模式(ES6+ 环境中,
import/export模块自动严格)
避免依赖隐式 this 绑定
传统非严格模式下,独立调用函数(如 foo())会让 this 指向全局对象,造成意外挂载属性。严格模式下它变成 undefined,但若代码仍尝试赋值(如 this.a = 1),会直接报错 Cannot set property 'a' of undefined——这是保护机制,不是 bug。
真正要规避的是“想用 this 却没正确绑定”的情况:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 事件回调、定时器、异步回调中,优先用箭头函数或显式绑定:
setTimeout(() => this.handleClick(), 100) - 对象方法被解构后调用(
const { method } = obj; method();):改用obj.method.bind(obj)或封装为箭头函数() => obj.method() - 构造函数必须用
new调用;否则在严格模式下this为undefined,直接报错,反而帮你提前发现误用
用 call/apply/bind 显式控制 this
当逻辑确实需要动态绑定 this,不要赌调用方式,主动掌控:
-
func.call(context, arg1, arg2)—— 立即执行,适合一次性的明确绑定 -
func.bind(context)—— 返回新函数,适用于需多次复用或传给回调的场景 -
func.apply(context, [args])—— 当参数是数组时更方便
注意:这些方法在严格模式下同样生效,且不会引发全局污染——因为 context 是你指定的对象,不是自动 fallback 到全局。
模块化 + 词法作用域优先
现代 JS 开发中,比纠结 this 绑定更根本的解法是减少对 this 的依赖:
- 用闭包和参数传递数据,而非靠
this隐式携带上下文 - 类中必要时用私有字段(
#field)或WeakMap存储实例数据,避免暴露或误操作this - 工具函数尽量设计为纯函数(无副作用、不依赖
this),提升可测试性和复用性
这样,this 绑定问题就从“如何修”变成了“是否真需要”。

















