前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库箭头函数 this 词法绑定原理
JavaScript函数与作用域

箭头函数的 this 指向谁?为什么 call 和 bind 改不了它?

箭头函数自己没有 this,里面的 this 就是它外层那个函数的 this,在写代码的位置就决定了。之后不管怎么调用它,包括用 call、bind 传一个新对象,都改不了。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#函数与作用域
先看核心答案读代码示例
理解线索

写在哪决定 `this`,而不是怎么调

  1. 普通函数this 看调用方式:new、call、obj.fn() 或直接调用
  2. 箭头函数不建自己的 this,往外找最近的普通函数或顶层
  3. 显式绑定对箭头函数传的 thisArg 被忽略,只有参数生效

箭头函数记住的是外层的 this 这个变量,不是某个对象的快照。外层函数每调用一次,里面新建的箭头函数就可能指向不同的对象。

核心回答

先记住这个答案

普通函数的 this 是调用时才确定的,看它是被 new 调用、用 call 指定,还是写成 obj.fn()。箭头函数不一样,它根本不创建自己的 this,函数体里的 this 会像普通变量一样往外找,用的是外层函数的 this。所以箭头函数的 this 在写代码的位置就定了,之后怎么调用、用 call 或 bind 传什么对象都改不了。这就是「词法绑定」的意思,词法就是按代码写的位置来确定。

  • 箭头函数的 this 等于外层函数的 this
  • call、apply、bind 改不了箭头函数的 this,参数照常传
  • 对象字面量不是作用域,里面写箭头方法拿不到对象
  • 箭头函数不能 new,也没有 prototype

call 为什么改不了箭头函数的 this

在一个方法里返回箭头函数,然后试着用 call 换一个对象调用它。

箭头函数一直用外层方法的 thisJavaScript
const counter = {
  value: 2,
  makeAdder() {
    return (step) => this.value + step // this 是 makeAdder 调用时的 this
  }
}
const add = counter.makeAdder()
console.log(add(3))
console.log(add.call({ value: 100 }, 3)) // 传进去的对象被忽略
查看输出与解释
5
5

counter.makeAdder() 调用时,makeAdder 的 this 是 counter。返回的箭头函数没有自己的 this,里面的 this 就是这个 counter。后面 add.call({ value: 100 }, 3) 想换对象,但箭头函数压根没有 this 可以换,第一个参数被直接忽略,第二个参数 3 照常传给了 step。 bind 也一样。对箭头函数 bind 会返回一个新函数,预置的参数有效,this 无效。

对象字面量里写箭头方法的坑

最常见的误用是把对象的方法写成箭头函数,以为 this 会指向这个对象。

箭头方法拿到的是对象外面的 thisJavaScript
function create() {
  return {
    name: 'obj',
    arrow: () => this.name, // 外层是 create,this 是 create 的 this
    normal() {
      return this.name // 普通方法,this 是调用它的对象
    }
  }
}
const o = create.call({ name: 'outer' })
console.log(o.arrow(), o.normal())
查看输出与解释
outer obj

对象字面量的花括号不是函数,不会产生 this。所以 arrow 往外找,找到的是 create 这次调用的 this,也就是传进去的 { name: 'outer' }。如果对象直接写在模块顶层,外层就是模块顶层,this 是 undefined,调用时会报错。需要用到对象本身的方法,要写成普通方法。

什么时候用箭头函数,什么时候别用

箭头函数最适合写在方法内部的回调里。比如类的方法里写 setTimeout(() => this.refresh(), 1000),回调里的 this 就是实例,不用再写 const self = this 或者 .bind(this)。数组的 map、Promise 的 then 里也一样。

类字段箭头函数的取舍
React 类组件里常写 handleClick = () => { this.setState(...) },这是类字段,每创建一个实例都会新建一个箭头函数,this 固定是这个实例,传给 onClick 也不会丢。代价是函数挂在实例上而不是原型上,实例多了会多占内存,子类也没法通过 super.handleClick() 调用它。 反过来,需要动态 this 的地方别用箭头函数:对象方法、原型方法、需要 new 的构造函数,以及想靠 this 拿到绑定元素的 DOM 事件监听。
回答前,多想一步

容易答错的地方

想用 bind 修箭头函数的 this
bind 对箭头函数的 this 没用。箭头函数的 this 不对,只能改它定义的位置,或者换成普通函数。
把对象的花括号当成一层作用域
{ fn: () => this } 里的 this 和对象没有关系。只有函数(普通函数、方法、类的构造过程)才会提供 this,对象字面量只是一个值。
以为箭头函数的 this 是创建时拍下的快照
箭头函数读的是外层的 this 本身。同一段代码里的箭头函数,外层函数被不同对象调用,新建出来的箭头函数 this 也不同,上面 create.call 的例子就是这样。
试着用自己的话回答

面试官还会怎么问?

箭头函数能当构造函数吗?

不能。箭头函数没有 prototype 属性,也没有构造能力,用 new 调用会抛 TypeError。

事件监听里用箭头函数会怎样?

addEventListener 调用普通函数时,会把 this 设成绑定监听的元素,也就是 event.currentTarget。换成箭头函数,this 就是外层的,比如组件实例或 undefined。想要元素就用 event.currentTarget,想要实例就用箭头函数。

箭头函数嵌套箭头函数,this 是谁的?

一层层往外找,直到遇到第一个普通函数,用它的 this;一直找到顶层都没有,就用顶层的 this,ES 模块里是 undefined,浏览器普通脚本里是 window。

从一道题,走向一组知识

把知识连起来

函数与作用域

JavaScript 中 this 的绑定规则有哪些?优先级如何?

普通函数的 this 由默认、隐式、显式、new 四条规则决定,箭头函数恰好一条都不适用。

函数与作用域

箭头函数里读 arguments,读到的是谁的?

箭头函数的 arguments 也是从外层拿的,和 this 是同一个原理。

函数与作用域

addEventListener 的回调里,this 指向谁?

事件监听里用普通函数时 this 是绑定元素,换成箭头函数就拿不到了,是箭头 this 最常见的实战场景。

放回知识体系中复习JavaScript 进阶知识

参考资料

  • Arrow function expressions

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. call 为什么改不了箭头函数的 this
  3. 对象字面量里写箭头方法的坑
  4. 什么时候用箭头函数,什么时候别用
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑