this指向取决于函数调用方式而非定义位置;点号左边对象即this值,箭头函数无this、继承外层普通函数的this,显式绑定对箭头函数无效,new调用时this指向新实例。

记住 this 的调用主体,关键不是死记规则,而是抓住一个核心:**this 指向谁,取决于函数「怎么被调用」,而不是「在哪定义」或「怎么声明」**。
看函数调用时的「点前面是谁」
这是最直观、最常用的方法——找调用表达式中 点(.)左边的对象:
-
obj.method()→this是obj -
arr.push(1)→this是arr -
foo()(没点、没对象)→ 在非严格模式下是window(浏览器),严格模式下是undefined
箭头函数没有自己的 this
箭头函数不绑定 this,它会沿作用域链向上找外层普通函数的 this 值,且无法被任何方式修改:
-
const obj = { name: 'Alice', say: () => console.log(this.name) };→say()中的this不是obj,而是定义时所在上下文的this(通常是全局) - 想让回调里保持对象上下文?用普通函数,或显式绑定(
bind/call/apply),或用箭头函数「借」外层的this
显式绑定优先级高,但箭头函数免疫
用 .call(obj, ...)、.apply(obj, [...])、.bind(obj) 可强行指定 this,但只对普通函数有效:
-
function fn() { return this.val; } fn.call({val: 42});→ 返回42 -
const arrow = () => this.val; arrow.call({val: 99});→ 仍用定义时的this,call完全无效
构造函数调用:new 关键字决定 this
当函数通过 new Fn() 调用时,this 自动指向新创建的实例对象:
-
function Person(name) { this.name = name; }→new Person('Bob')中的this是那个新Person实例 - 注意:箭头函数不能当构造函数(调用
new会报错),所以不存在「箭头函数的 new 绑定」
不复杂但容易忽略:先盯紧调用形式,再判断是否为箭头函数,最后看有没有显式或 new 绑定。练几次,看到 . 就条件反射想左边,就稳了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











