javascript中暂存this应使用普通变量(如self),而非全局self;因回调等场景this易丢失,需在有效时用const self = this捕获,再于嵌套函数中使用。

在 JavaScript 中,self 并不是专门用来“暂存 this”的标准方式——它通常指向全局对象(浏览器中等价于 window),和 this 的绑定无关。真正常用、可靠且符合直觉的做法是用一个普通变量(如 that、self 或 _this)手动保存外层函数的 this 值。虽然名字叫 self,但它只是个变量名,和全局 self 无关。
为什么需要暂存 this?
因为函数内部的 this 会随调用方式改变。尤其在回调、事件监听器或定时器中,this 往往丢失原始上下文(比如指向 window 或 undefined)。这时需在进入新作用域前,把外层有效的 this 保存下来。
用变量(如 self)保存 this 的写法
在函数开头,用 const self = this(或 let/var)捕获当前 this,之后在嵌套函数中使用 self 访问原始实例:
- 适用于传统 function 声明(箭头函数不适用此场景,见下条)
- 必须在
this还有效的位置立即赋值(不能在回调里再取) - 变量名可任意,
self是常见约定,但不是关键字
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Counter() {
this.count = 0;
const self = this; // ✅ 暂存 this
document.addEventListener('click', function() {
self.count++; // ✅ 使用保存的 this
console.log(self.count);
});
}
更现代、推荐的替代方案
相比手动暂存,以下方式更简洁、不易出错:
-
用箭头函数:它不绑定自己的
this,自动继承外层词法作用域的this -
用 bind(this):显式绑定回调函数的
this - 用 class 字段 + 箭头函数(ES2022+):在类中定义箭头方法,天然绑定实例
例如:
class Counter {
count = 0;
constructor() {
document.addEventListener('click', () => {
this.count++; // ✅ 箭头函数,this 指向实例
console.log(this.count);
});
}
}
注意 self 的歧义
避免混淆:self 在浏览器环境中是只读全局属性,指向 window.self;在 Web Worker 中指向 WorkerGlobalScope。如果你在函数内声明 const self = this,那只是局部变量,和全局 self 无关。但为减少误解,不少团队倾向用 that 或 ctx 替代。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










