函数调用时的this值取决于调用方式:普通函数由调用者决定(obj.fn()指向obj,独立调用指向全局或undefined,new指向实例,call/apply/bind可显式指定);箭头函数无this,继承外层词法作用域的this且不可更改。

函数调用时的 this 值,取决于**调用方式**,而不是定义位置或声明方式。ES6 箭头函数除外,它没有自己的 this,会沿作用域链向上继承外层函数的 this。
普通函数:看“谁调用了它”
非箭头函数的 this 由调用它的**对象(调用者)**决定,规则简单但容易混淆:
- 如果通过对象方法调用,比如
obj.fn(),this指向obj; - 如果是独立调用,比如
fn()(没加点、没绑定、没 new),在非严格模式下指向全局对象(浏览器是window),严格模式下是undefined; - 用
new调用时,this指向新创建的实例对象; - 用
call、apply或bind显式指定时,this就是传入的第一个参数(null或undefined在非严格模式下会被自动替换为全局对象)。
箭头函数:没有 this,只继承外层
箭头函数不绑定自己的 this,它会直接使用定义时所在词法作用域中的 this 值,且这个绑定不可更改:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写在对象方法里?它不会获得对象的
this,而是取外层函数(或全局)的this; - 写在事件回调或定时器里?常见陷阱是想访问对象属性却拿不到,因为外层可能是全局或 undefined;
- 不能用
call/apply/bind改变它的this,这些方法对箭头函数无效。
常见坑点和应对建议
实际开发中容易出错的地方,往往不是规则记不住,而是调用上下文被隐式改变:
立即学习“Java免费学习笔记(深入)”;
- 把对象方法赋值给变量再调用:
const f = obj.method; f();→this丢失,变成全局或 undefined;解决办法:用bind、箭头函数包装,或改用obj.method.bind(obj); - 作为回调传入(如
setTimeout(obj.method, 100)或button.addEventListener('click', obj.handleClick))→ 同样丢失this;推荐用bind、箭头函数,或在类中用属性初始化语法定义箭头方法(handleClick = () => { ... }); - 嵌套函数中误以为内层函数能访问外层
this:普通函数不行,要用const self = this缓存,或改用箭头函数。
快速判断口诀
看到一个函数调用,三步确认 this:
- 是不是箭头函数?→ 是,就找定义位置的外层
this; - 是不是用
new、call、apply、bind?→ 是,按对应规则; - 否则看调用形式:
obj.fn()→this是obj;fn()→ 看是否严格模式,再定。

















