前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库箭头函数没有 arguments 获取外层 arguments
JavaScript函数与作用域

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

箭头函数不创建自己的 arguments,里面写的 arguments 就是个普通变量名,会顺着作用域往外找,找到最近的普通函数的那一份。想拿箭头函数自己这次调用的参数,要写成 (...args) => {}。

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

箭头函数借用外层的调用信息

  1. 普通函数每次调用都新建自己的 this 和 arguments
  2. 箭头函数两样都不建,读到的都是外层函数的
  3. rest 参数(...args) 收集箭头函数这次调用传入的值,是真数组

把箭头函数传给 setTimeout 或别的模块再调用,它读到的 arguments 也不会变,永远是定义时外层那次调用的。

核心回答

先记住这个答案

普通函数每次被调用,都会新建一个 arguments 对象;箭头函数不建。所以在箭头函数里写 arguments,引擎把它当成普通变量,沿着作用域链往外找,找到的是包着它的最近一个普通函数的 arguments。外面没有普通函数,比如在 ES 模块顶层,就会抛 ReferenceError。想拿箭头函数自己这次调用的参数,用 rest 参数 (...args) => {}。

  • 箭头函数里的 arguments 属于定义它的外层普通函数
  • 往外找看的是写在哪,不是谁调用了它
  • 外面没有普通函数时会抛 ReferenceError
  • 要拿箭头自己的参数,用 rest 参数

两层参数放在一起看

外层普通函数收到两个参数,里面的箭头函数收到三个参数,分别打印出来就清楚了。

arguments 和 rest 的来源不同JavaScript
function outer(a, b) {
  const inner = (...own) => {
    console.log(arguments.length, arguments[0]) // outer 的参数
    console.log(own.length, own[0]) // inner 自己的参数
  }
  inner('x', 'y', 'z')
}
outer('a', 'b')
查看输出与解释
2 a
3 x

inner 明明是用三个参数调用的,里面的 arguments 却只有两个元素,第一个是 'a'。因为 arguments 是 outer 那次调用的,own 才是 inner 自己的。 这和闭包读外层变量是同一回事。箭头函数写在 outer 里,它能看到 outer 的局部变量,arguments 也被当成 outer 的一个局部变量。查找只看代码写在哪,不看运行时谁调用了它。

为什么这样设计:回调里想要外层的东西

箭头函数是为短回调设计的。写回调时,大多数情况想用的其实是外层函数的 this 和参数,而不是回调自己的。以前的写法是先 var self = this; var args = arguments,再在回调里用,箭头函数把这一步省掉了。

防抖函数里直接用外层的 argumentsJavaScript
function debounce(fn, wait) {
  let timer
  return function () {
    clearTimeout(timer)
    // 箭头函数里的 this 和 arguments 都是外层 function 这次调用的
    timer = setTimeout(() => fn.apply(this, arguments), wait)
  }
}
const log = debounce((a, b) => console.log(a, b), 100)
log(1, 2)
log(3, 4) // 前一次被清掉,只执行这一次
查看输出与解释
3 4

setTimeout 调用箭头函数时不会传参数,但箭头函数里的 arguments 本来就不是它自己的,读到的是返回的那个普通函数最后一次被调用时的参数。如果这里写成普通 function,arguments 就变成定时器回调自己的,是空的。

什么时候不能用箭头函数
函数需要自己的 this、需要自己的 arguments、需要被 new 调用,这三种情况都要用普通函数。如果只是需要不定数量的参数,箭头函数加 rest 就够,不必为了 arguments 改回普通函数。
回答前,多想一步

容易答错的地方

以为箭头函数会拿到调用者的 arguments
作用域是按代码写的位置确定的,不会顺着调用栈去找。把箭头函数传给别的函数去调用,它读到的仍是定义时外层函数的 arguments。
在模块顶层读 arguments
ES 模块和浏览器的普通脚本顶层都没有 arguments,会抛 ReferenceError。Node.js 的 CommonJS 文件顶层能读到,是因为模块代码被包在一个函数里执行,读到的是那个包装函数的参数,和你的业务没有关系。
试着用自己的话回答

面试官还会怎么问?

箭头函数的 this 是不是也这样?

是一样的。箭头函数不建自己的 this,读的是外层的。所以对箭头函数调用 call、apply、bind 传进去的 this 都会被忽略,只有参数能传进去。

rest 参数和 arguments 有什么区别?

rest 参数是真数组,可以直接 map、filter;它只收集没有被前面形参接住的那部分;箭头函数里也能用。arguments 是类数组,收集全部实参,箭头函数里没有自己的。

箭头函数一直引用外层 arguments,会不会占内存?

只要箭头函数还被引用着,比如挂在事件监听或定时器上,外层函数的作用域就不会被回收,里面的 arguments 也一起留着。长期存在的回调只拿需要的那几个值,用完及时解绑。

从一道题,走向一组知识

把知识连起来

函数与作用域

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

箭头函数的 this 和 arguments 都不自己建,都从外层拿,原理完全一样。

函数与作用域

剩余参数 ...args 和 arguments 有什么区别?为什么推荐用前者?

rest 参数是箭头函数拿自己参数的唯一办法,也是替代 arguments 的现代写法。

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

参考资料

  • Arrow function expressions

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

本题目录
  1. 先记住这个答案
  2. 两层参数放在一起看
  3. 为什么这样设计:回调里想要外层的东西
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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