嵌套函数中this丢失是因为this取决于调用方式而非定义位置;解决方法是用const self = this在外层方法内暂存this,再在嵌套函数中使用self访问原始对象。

在 JavaScript 中,对象方法里嵌套函数(比如回调、定时器、事件处理等)时,this 会丢失,指向全局对象(非严格模式)或 undefined(严格模式)。常见解决方式之一是用变量暂存外层 this,比如 const self = this 或 const that = this。
为什么嵌套函数中 this 会丢失?
因为 this 的值取决于函数「如何被调用」,而不是「在哪里定义」。嵌套的普通函数(非箭头函数)独立调用时,this 不继承外层上下文,而是按调用方式重新绑定。
例如:
const obj = {
name: 'Alice',
sayHi() {
setTimeout(function() {
console.log(this.name); // undefined —— this 指向 global 或 undefined
}, 100);
}
};
obj.sayHi();
用变量暂存 this(传统可靠写法)
在函数执行前,把当前 this 赋给一个局部变量(如 self、that 或 _this),在嵌套函数中使用该变量访问原始对象。
立即学习“Java免费学习笔记(深入)”;
- 变量名建议用
self或that,语义清晰,社区通用 - 声明位置必须在外层函数作用域内,且在嵌套函数定义/调用前
- 适用于所有环境(包括不支持箭头函数的老浏览器)
const obj = {
name: 'Alice',
sayHi() {
const self = this; // ✅ 暂存 this
setTimeout(function() {
console.log(self.name); // 'Alice'
}, 100);
}
};
其他等效但更现代的写法(供参考)
虽然题目聚焦「变量暂存」,但了解替代方案有助于判断场景:
-
箭头函数:自动继承外层
this,无需暂存(推荐新项目优先使用) -
.bind(this):显式绑定this,适合需复用的函数 -
.call()/.apply():适合一次性调用,传参灵活
// 箭头函数(最简洁)
setTimeout(() => console.log(this.name), 100);
// bind 方式
setTimeout(function() {
console.log(this.name);
}.bind(this), 100);
注意点和易错情况
- 不要在对象字面量顶层直接写
const self = this——此时this是全局对象,无效 - 确保暂存发生在方法内部、嵌套函数调用之前(顺序很重要)
- 若嵌套多层,每层都需独立暂存(或统一用箭头函数避免层层传递)
- TypeScript 中可配合
this: SomeType显式标注,增强类型安全


















