先判箭头函数(无this,沿用外层);再看new/call/apply/bind(显式绑定优先);接着查obj.method()隐式绑定及丢失;最后默认调用(非严格window,严格undefined)。

面试中遇到 this 指向题,别硬背,用一个清晰、有优先级的判断顺序就能稳准快解题。核心不是“函数在哪写的”,而是“函数是怎么被调用的”。
先看是不是箭头函数
这是最高优先级规则。箭头函数没有自己的 this,它直接沿用外层普通函数(或全局)作用域的 this 值。
- 哪怕写在对象方法里,只要它是箭头函数,this 就不指向该对象
- 外层如果是全局,this 就是 window(非严格)或 undefined(严格)
- 外层如果是普通函数,就继续按该函数的 this 规则向上推
再看有没有 new、call、apply 或 bind
这三类属于显式干预,优先级高于默认和隐式绑定。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- new:this 一定指向新创建的实例对象
- call / apply:第一个参数就是 this 的值,立即执行
- bind:返回一个 this 被永久绑定的新函数(注意:多次 bind 只认第一次)
- 箭头函数内部用 call/bind 无效,它的 this 不可被修改
接着看调用形式:是不是对象点出来的
这是最常考也最容易掉坑的场景——“隐式绑定”及其“丢失”。
立即学习“Java免费学习笔记(深入)”;
- obj.method() → this 指向 obj
- const fn = obj.method; fn() → this 指向全局(非严格)或 undefined(严格),因为已脱离对象上下文
- 常见陷阱:setTimeout(obj.method, 100), 事件回调 obj.handleClick 等,都属于隐式丢失
最后看默认调用情况
如果以上都不满足,就回到最基础的调用方式:
- 单独写 fn() → 非严格模式下 this 是 window,严格模式下是 undefined
- 全局作用域中直接写 console.log(this) → 浏览器中仍是 window
- 数组元素调用如 arr[2]() → this 指向 arr(属于隐式绑定的特例,但可统一记为“谁点谁负责”)

















