避免内层普通函数this丢失,关键在于保持调用上下文:①用箭头函数继承外层this;②提前缓存this引用;③用call/apply显式绑定。

避免对象内层嵌套普通函数时 this 丢失,关键在于不让函数脱离原始调用上下文——普通函数在独立调用时会触发默认绑定(严格模式下为 undefined),而嵌套层级越深,越容易因调用方式变化导致 this “断连”。
别让内层函数脱离外层 this 的作用域
普通函数不继承外层 this,哪怕写在方法内部,只要被单独调用,this 就重置。比如:
const obj = {
name: 'Alice',
outer() {
function inner() { console.log(this.name); } // ❌ this 不是 obj
inner(); // 输出 undefined(严格模式)
}
};
这里 inner() 是独立调用,和 obj 无关。
用箭头函数替代普通函数声明
箭头函数没有自己的 this,它直接沿用定义时外层函数的 this 值,天然适配嵌套场景:
- 把
function inner() { ... }改成const inner = () => { ... } - 确保
outer方法本身是通过obj.outer()调用的(隐式绑定成立) - 这样
inner内部的this就始终指向obj
提前缓存 this 引用(传统但可靠)
在 outer 方法开头用变量保存 this,内层函数通过该变量访问实例:
-
const self = this;或const that = this; - 内层普通函数里改用
self.xxx替代this.xxx - 适用于需兼容老旧环境、或函数需动态改变
this的少数情况
避免直接调用,改用 call/apply 显式传入
如果必须保留普通函数形式,又需要控制执行时的 this,可在调用时手动指定:
inner.call(this, arg1, arg2)inner.apply(this, [arg1, arg2])- 适合逻辑明确、参数固定、且只在局部调用的场景

















