this指向由调用方式决定,遵循默认绑定(非严格模式为window,严格模式为undefined)、隐式绑定(点号左侧对象)、显式绑定(call/apply/bind)和new绑定(最高优先级)四条规则,箭头函数则继承外层词法作用域的this。

函数执行时的 this 指向不是写死的,它完全由“谁调用”和“怎么调用”决定。掌握四条绑定规则及其优先级,就能在任何场景下快速判断 this 是什么。
默认绑定:独立调用时的兜底规则
当函数以最简单的方式被调用——没有点号、没有 new、没用 call/apply/bind——就触发默认绑定。
- 非严格模式下,this 指向全局对象(浏览器中是 window)
- 严格模式下(加了
"use strict"),this 为 undefined - 常见陷阱:把对象方法赋给变量后再调用,比如
const fn = obj.method; fn();,此时已失去上下文,退化为默认绑定
隐式绑定:看“点左边是谁”
函数通过对象属性访问并调用,例如 obj.doSomething() 或 obj.nested.fn(),this 就指向“点号左侧最近的那个对象”。
-
obj.nested.fn()中,this 指向nested,和obj无关 - 隐式绑定容易丢失:解构赋值(
const { method } = obj;)、作为回调传入(setTimeout(obj.method, 100))、数组取值([obj.method][0]())都会导致 this 脱离原对象
显式绑定:用 call、apply、bind 强制指定
你可以主动控制 this 指向,三者区别在于执行时机和参数传递方式:
-
fn.call(obj, a, b):立即执行,参数逐个传 -
fn.apply(obj, [a, b]):立即执行,参数用数组传 -
fn.bind(obj, a):不执行,返回一个新函数,this 和部分参数被永久固化(硬绑定) - 注意:bind 返回的函数,后续再用 call/apply 也无法覆盖其 this
new 绑定与箭头函数的词法 this
构造函数调用(new Fn())时,this 指向新创建的实例对象;而箭头函数没有自己的 this,它直接沿用外层普通函数执行时的 this 值,且不可被任何绑定方式修改。
- new 绑定优先级最高,高于显式绑定
- 箭头函数的 this 在定义时就确定,运行时不会变,适合用在回调、定时器、事件监听等易丢失 this 的场景
- 如果箭头函数写在全局作用域,它的 this 就是全局对象(或 undefined,若在严格模式顶层)

















