判断this绑定需按调用位置逐层检查:1. new调用→this指向新对象;2. call/apply/bind显式绑定→this为传入对象(箭头函数无效);3. 对象方法调用→this指向点号左侧对象;4. 否则默认绑定:严格模式为undefined,非严格模式为全局对象。

要判断 this 的绑定,关键不是死记规则,而是按执行时的**调用位置**,逐层检查是否符合某类绑定优先级。下面是一个可落地的逻辑判断树,帮你快速定位 this 指向。
1. 是否是 new 调用?
如果函数是以 new Fn() 形式调用,this 指向新创建的对象,且无法被其他绑定方式覆盖。
- 检查调用表达式最左边是否有
new关键字 - 注意:箭头函数不能被
new调用,会直接报错,不进入此分支
2. 是否由 call、apply 或 bind 显式绑定?
如果函数通过 fn.call(obj, ...)、fn.apply(obj, [...]) 或 fn.bind(obj) 调用,this 就是传入的第一个参数(除非传入 null/undefined 且在非严格模式下会被忽略)。
-
bind返回的是新函数,其this已固化,后续再用call也无法覆盖(除非再次bind) - 箭头函数没有自己的
this,显式绑定无效,它沿用外层作用域的this
3. 是否是对象方法调用(隐式绑定)?
检查调用形式是否为 obj.method():即点号(或方括号)左侧是否是一个对象引用,且该引用在调用时仍然有效。
- 常见陷阱:赋值后调用,如
let fn = obj.method; fn();→ 此时丢失隐式绑定,this在非严格模式下为window,严格模式下为undefined - 嵌套对象也适用,如
obj.a.b.c(),this指向obj.a.b
4. 默认绑定(兜底)
以上都不满足时,进入默认绑定:
- 严格模式下:
this是undefined - 非严格模式下:
this指向全局对象(浏览器中是window,Node 中是global) - 注意:箭头函数不遵循此规则,它没有自己的
this,始终继承外层函数的this值
这个判断树不是理论推演,而是你调试时可以逐行看代码执行路径的 checklist。只要盯住「函数是怎么被调用的」,就能稳住 this 的归属。











