判断this指向需按四步顺序提问:一是是否箭头函数,若是则取外层普通函数的this;二是是否new调用,若是则this为新实例;三是是否显式绑定(call/apply/bind),若是则this为指定对象;四是调用方式,有调用者则this为该对象,否则按严格模式返回undefined或非严格模式返回全局对象。

判断 this 指向,关键不是死记流程图,而是建立一条清晰、可操作的判定路径。只要按顺序问自己这四个问题,95% 的场景都能快速定位。
第一步:是不是箭头函数?
先看函数类型——箭头函数没有自己的 this,直接跳过所有绑定规则,它的 this 就是定义时外层第一个普通函数的 this(若在全局定义,就是 window 或 undefined)。
- 是箭头函数 → 看它写在哪一层函数里,那一层的
this就是它的this - 不是箭头函数 → 进入下一步
第二步:有没有用 new 调用?
new Fn() 是优先级最高的绑定方式,this 一定指向新创建的实例对象(除非构造函数显式返回一个对象)。
- 用了
new→this是新对象,结束判断 - 没用
new→ 继续往下
第三步:有没有用 call、apply 或 bind?
显式绑定次高优先级。只要调用时用了这三个方法之一,this 就是你传进去的那个对象(bind 返回的函数还会“锁住”这个 this,后续再用 call 也改不了)。
- 有显式绑定 →
this就是参数指定的对象 - 没有 → 进入最后一步
第四步:怎么调用的?点号或中括号左边是谁?
这是隐式绑定的判断依据。看函数执行前有没有“调用者”,也就是 obj.method() 或 arr[0]() 中的 obj 或 arr —— this 就指向那个对象。
- 有明确调用者(如
user.getName())→this指向user - 没有调用者(如
const fn = user.getName; fn();)→ 回退到默认绑定
默认绑定很简单:
- 非严格模式 → this 是 window(浏览器)或 global(Node.js)
- 严格模式 → this 是 undefined
这条路径不依赖记忆图形,只靠四次提问,每次只关注一个确定特征。练几次,就成了条件反射。











