“谁调用就指向谁”仅在隐式绑定(如obj.method())时成立;真正决定this的是调用方式:new绑定指向新实例,显式绑定(call/apply/bind)指向指定对象,普通调用指向全局或undefined,箭头函数继承外层this。

“谁调用就指向谁”这个说法,只在一种情况下成立——隐式绑定,也就是函数作为对象的方法被调用时。但它不是万能口诀,容易误导初学者。真正区分 this 指向,关键不是“看谁写了函数”,而是看函数怎么被调用的。
一、先记住:this 是调用时决定的,不是定义时
函数写在哪、嵌套几层、是不是箭头函数……这些都不直接决定 this。唯一决定因素是调用那一行代码的语法形式。比如:
-
obj.method()→ this 指向 obj(隐式绑定) -
const fn = obj.method; fn();→ this 不再是 obj,而是全局或 undefined(默认绑定) -
obj.method.call(otherObj)→ this 强制指向 otherObj(显式绑定)
二、五种调用方式对应五种 this 绑定规则(优先级从高到低)
按实际调用写法逐条对照,就能准确定位:
-
new 调用:如
new Person()→ this 指向新创建的实例对象 -
call / apply / bind 显式调用:如
fn.call(obj)→ this 就是你传进去的那个 obj -
对象方法调用(隐式):如
obj.doSomething()→ this 指向点号前面的 obj -
普通函数调用:如
doSomething()(单独写,没点、没 new、没 call)→ 非严格模式下是 window 或 global,严格模式下是 undefined - 箭头函数:它没有自己的 this,直接沿用外层普通函数作用域里的 this 值
三、常见“谁调用就指向谁”失效的坑
很多新手以为赋值后调用还是“原对象调用”,其实不是:
-
const handler = obj.handleClick; button.onclick = handler;→ 点击时是 button 触发,但 handler 是独立调用,this 是全局或 undefined -
setTimeout(obj.method, 100)→ method 被 setTimeout 内部以普通函数方式调用,丢失 obj 上下文 -
list.map(obj.method)→ map 的回调里,method 是被数组元素“间接调用”,不是 obj 调用,this 也不再是 obj
四、快速判断小技巧
看到一行函数调用,三步自问:
- 有没有
new?有 → this 是新实例 - 有没有
.call(…)、.apply(…)、.bind(…)?有 → this 就是括号里第一个参数 - 有没有点号前的对象?像
obj.fn()这样?有 → this 就是那个 obj;否则就是默认绑定
箭头函数不用问,直接看它外面最近一层普通函数的 this 是什么。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











