javascript中对象方法的this指向由调用方式决定:对象直接调用时指向该对象;赋值后单独调用会丢失this;作为回调传入时同样丢失;箭头函数不绑定this,继承外层作用域。

JavaScript中对象方法被调用时,this的指向由**调用方式决定**,而非定义位置。简单说:谁调用这个方法,this就指向谁。
直接通过对象调用(最常见)
当方法写在对象里,并用 obj.method() 形式调用时,this 指向该对象。
- 这是最符合直觉的情况,也是设计初衷
- 例如:
const user = { name: 'Alice', say() { console.log(this.name); } }; user.say(); // 输出 'Alice' - 此时 this 就是
user
赋值后单独调用(容易出错)
把方法提取出来再调用,比如 const fn = obj.method; fn();,this 会丢失,指向全局对象(非严格模式)或 undefined(严格模式)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 因为这时调用的是一个普通函数,不再绑定原对象
- 解决办法有三种:
fn.call(obj)、fn.bind(obj),或用箭头函数包装(但箭头函数本身不绑定 this,需配合上下文) - 现代常用:
const boundFn = obj.method.bind(obj);或const say = () => obj.method();
作为回调函数传入(如事件监听、定时器)
把对象方法直接传给 addEventListener、setTimeout 等,this 同样会丢失。
- 例如:
btn.addEventListener('click', obj.handleClick);—— 点击时 this 指向btn,不是obj - 推荐写法:
btn.addEventListener('click', () => obj.handleClick());或btn.addEventListener('click', obj.handleClick.bind(obj)); - 类中可提前在构造函数里绑定:
this.handleClick = this.handleClick.bind(this);
箭头函数不绑定this(继承外层)
箭头函数没有自己的 this,它沿作用域链向上找最近的非箭头函数的 this 值。
- 所以不能靠箭头函数“修复”对象方法的 this,但它适合在回调中保持外层对象上下文
- 例如:
const obj = { name: 'Bob', init() { setTimeout(() => console.log(this.name), 100); } };—— 这里 this 正确指向obj - 注意:箭头函数不能用
call/apply/bind改变 this
不复杂但容易忽略,关键是盯住“谁在调用”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










