箭头函数的this是词法绑定的,继承定义时外层普通函数的this值,无法被call/apply/bind修改;普通函数的this是动态绑定的,取决于调用方式,可被显式指定或指向新实例。

箭头函数没有自己的 this,它直接沿用定义时所在外层普通函数执行上下文中的 this 值;普通函数的 this 则在调用时才确定,完全取决于函数怎么被调用。
箭头函数:this 是词法绑定的
它不关心自己在哪执行,只认“出生地”:
- 定义时外层最近的那个普通函数执行时的 this 是多少,它就继承多少
- 如果外层没有普通函数(比如直接写在全局或模块顶层),this 就是全局对象(浏览器中为 window)或 undefined(严格模式)
- call、apply、bind 对它完全无效——改不了,也覆盖不了
- 在对象字面量里直接写箭头函数,this 不会指向该对象,因为对象本身不产生执行上下文
普通函数:this 是动态绑定的
它的 this 在运行时才落定,谁调、怎么调,就指向谁:
- 作为对象方法调用:obj.fn() → this 指向 obj
- 单独调用:fn() → 非严格模式下指向 window,严格模式下为 undefined
- 用 call/apply/bind 调用 → this 可显式指定为任意对象
- 用 new 调用 → this 指向新创建的实例
典型场景对比:哪里容易出错?
这些例子最能体现差异:
- 定时器回调中访问实例属性:普通函数里 this 会变成 window 或 undefined;箭头函数天然保持外层类/方法的 this
- 把类方法传给 map、addEventListener 等:普通函数的 this 丢失;箭头函数(如类字段写法 handleClick = () => {})自动保留实例上下文
- 对象方法内部嵌套箭头函数:能正常访问 this.name;但若把箭头函数直接写在对象字面量里,this.name 通常是 undefined
怎么选?看需求是否需要 this 变化
不需要 this 动态切换 → 用箭头函数(回调、遍历、工具逻辑);需要明确归属或支持 new 调用 → 必须用普通函数(对象方法、构造器、事件监听且希望 this 是触发元素)。











