严格模式下普通函数独立调用时this被明确设为undefined;可通过call/apply/bind显式绑定、箭头函数继承外层this、避免错误调用、缓存this引用来解决。

严格模式下普通函数独立调用时,this 不是“丢失”,而是被明确设为 undefined——这是设计行为,不是 bug。关键在于主动控制 this 值,而不是被动修复“丢失”。
显式绑定 this:call、apply、bind
这是最直接、最可控的方式,适合需要动态或固定上下文的场景:
-
func.call(obj, arg1, arg2):立即执行,this 指向obj -
func.apply(obj, [arg1, arg2]):参数以数组传入,效果同上 -
const bound = func.bind(obj):返回新函数,this 永久绑定为obj,可复用
例如:
const user = { name: 'Alice' };function greet() { return `Hello, ${this.name}`; }
greet(); // 严格模式下报错
greet.call(user); // "Hello, Alice"
用箭头函数继承外层 this
适用于回调中需沿用定义时所在作用域的 this(如类方法里的定时器、事件监听):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 箭头函数不绑定自己的 this,而是从外层函数作用域查找
- 不能被
call/apply/bind改变 this - 不适用于需要动态 this 的场景(比如 DOM 事件处理器期望 this 是触发元素)
例如:
const obj = { name: 'Bob', init() { setTimeout(() => console.log(this.name), 100); } };obj.init(); // 输出 "Bob"
避免 this 脱离上下文的调用方式
很多问题其实源于调用姿势不当,提前规避比事后补救更高效:
- 不要把对象方法直接赋值给变量再调用:
const fn = obj.method; fn();→ 此时 this 为undefined - 传递方法作回调时,优先用
fn.bind(obj)或箭头函数包装:setTimeout(() => obj.method(), 100) - 在类中处理事件或异步回调,推荐用字段级箭头函数写法:
handleClick = () => { console.log(this.state); }
临时保存 this 引用(that / self)
传统但稳定的做法,适合兼容老环境或逻辑较复杂的回调:
- 在函数开头用
const self = this或const that = this缓存当前上下文 - 回调内部统一使用
self访问属性和方法 - 注意变量作用域,确保
self在回调内可访问
例如:
start() {const self = this;
setTimeout(function() { console.log(`Hello from ${self.name}`); }, 100);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










