当对象方法赋值给变量后单独调用,this 丢失绑定:非严格模式指向全局对象,严格模式为 undefined;可通过 bind、call/apply 或箭头函数修复。

当一个对象的方法被赋值给变量后单独调用,this 会丢失原本的绑定,指向 全局对象(非严格模式)或 undefined(严格模式),而不是原对象。
隐式绑定失效的典型场景
隐式绑定依赖于“点号调用”(obj.method())这一形式。一旦方法脱离对象上下文,比如赋值给变量或作为参数传递,就不再满足隐式绑定条件。
- 赋值后直接调用:变量只是引用了函数,不携带任何绑定信息
-
作为回调传入函数:如
setTimeout(obj.method, 100),此时 method 被当作普通函数执行 -
解构赋值获取方法:如
const { method } = obj;,等价于赋值操作
不同模式下的 this 表现
严格模式与非严格模式对独立调用的 this 处理不同:
-
非严格模式:
this指向全局对象(浏览器中是window,Node.js 中是global) -
严格模式:
this为undefined,调用时若访问属性会报错(如undefined.name)
如何保持 this 的正确指向
有几种常用方式可修复丢失的绑定:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
使用箭头函数包装:
const fn = () => obj.method();,利用词法作用域捕获外层 this -
显式绑定:用
bind创建新函数:const bound = obj.method.bind(obj); -
调用时重新指定上下文:用
call或apply,如obj.method.call(obj) -
在对象内定义时用箭头函数(仅限类字段语法):如
method = () => { ... },但注意这会失去原型共享优势
实际例子对比
看这段代码:
const obj = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
const sayHi = obj.greet; // 方法赋值给变量
sayHi(); // 非严格模式输出 "Hello, undefined";严格模式报错
因为 sayHi() 是独立调用,this 不再是 obj。要让它正常工作,可以写成:
sayHi.call(obj)const boundSayHi = obj.greet.bind(obj); boundSayHi();const sayHi = () => obj.greet();

















