this的指向由函数调用方式决定,判定顺序为:1. 箭头函数继承外层非箭头函数的this;2. call/apply/bind显式绑定优先级最高;3. 对象方法调用时this指向直接调用者;4. 独立调用时非严格模式为globalThis,严格模式为undefined。

this 的指向判定,核心在于**函数的调用方式**,而非定义位置或词法作用域。在复杂场景下(如嵌套、箭头函数、call/apply/bind、事件回调、类方法等),需按明确的优先级顺序逐层判断,不能凭直觉或“外层作用域”猜测。
1. 箭头函数:无视调用方式,继承外层普通函数的 this
箭头函数没有自己的 this,它会沿作用域链向上查找最近的**非箭头函数**的 this 值,并永久绑定(无法被 call/bind 改写)。
示例:
const obj = {name: 'Alice',
normal() {
return () => this.name; // this 指向 obj
},
arrow: () => this.name // this 指向全局(模块顶层 this 通常为 undefined)
};
obj.normal()(); // 'Alice'
obj.arrow(); // undefined(非严格模式下可能是 globalThis)
2. 显式绑定:call / apply / bind 优先级最高(除箭头函数外)
当函数通过 call、apply 或 bind 调用时,this 被显式指定,且 bind 创建的绑定函数具有“硬绑定”特性(后续 call/apply 无法覆盖,除非再次 bind)。
- fn.call(obj, ...) → this = obj
- const bound = fn.bind(obj); bound() → this = obj(即使 laterObj.bound() 也仍是 obj)
- bound.call(other) → this 仍为 obj(硬绑定不可覆盖)
3. 隐式绑定:对象方法调用(点号或方括号)
当函数作为对象的属性被调用(obj.method() 或 obj['method']()),this 指向该**直接调用者对象**。注意:一旦赋值给变量或解构,隐式绑定就丢失。
常见陷阱:
const obj = { value: 42, foo() { return this.value; } };const bar = obj.foo; // 赋值后脱离对象
bar(); // undefined(严格模式)→ this 是 undefined,不是 obj
obj.foo(); // 42 → this 是 obj
// 解构同理:
const { foo } = obj;
foo(); // 同样丢失 this
4. 默认绑定:独立调用(无上述任何绑定)
函数以简单形式调用(如 fn()),this 在非严格模式下为 globalThis(浏览器中是 window),严格模式下为 undefined。
注意:类中的方法若未绑定,在事件监听器或回调中常落入此情况。
class Button {constructor() {
this.label = 'Click me';
}
clickHandler() { console.log(this.label); }
}
const btn = new Button();
document.addEventListener('click', btn.clickHandler); // this === undefined
不复杂但容易忽略:判定时只需按「箭头函数 → 显式绑定 → 隐式绑定 → 默认绑定」顺序检查,每一步成立即终止,无需叠加判断。

















