前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库箭头函数没有 arguments 获取外层 arguments
JSJavaScript函数与作用域

箭头函数为什么没有自己的 arguments 对象?如何获取所在外层函数的 arguments?

箭头函数不创建自己的 arguments 对象,在其中引用 arguments 会沿词法作用域链找到外层函数的 arguments。若想获取外层函数的 arguments,可直接引用该标识符,或以剩余参数替代。

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

词法绑定与作用域链

  1. 无自有 arguments箭头函数不产生 arguments 对象。
  2. 词法查找按定义时作用域链向上找最近普通函数。
  3. 替换方案剩余参数 ...args 提供显式实参数组。

在箭头函数内使用 arguments 时,其值取决于定义位置的外层函数,而非调用方式。

核心回答

先记住这个答案

箭头函数没有自己的 arguments 绑定,这是它与普通函数的重要区别之一。当在箭头函数内部写 arguments 时,JavaScript 引擎会沿作用域链向上查找,找到最近的外层普通函数的 arguments 对象。若定义在顶层(无任何外层普通函数),则 arguments 不可用,访问会抛出 ReferenceError。要获取外层函数的 arguments,直接引用外层函数作用域中的 arguments 即可,但更推荐使用剩余参数语法,因其明确且不受层级干扰。

  • 箭头函数无 arguments 绑定,按词法查找外层。
  • 可用外层函数作用域中的 arguments 对象。
  • 剩余参数是推荐替代,避免歧义。

机制:词法作用域如何影响 arguments

普通函数在每次调用时会创建一个新的 arguments 对象,并将实参按索引存入其中。箭头函数则完全没有这个步骤,其函数体中的 arguments 标识符既不是局部变量也不是参数,而是被视为一个自由变量,解析时沿作用域链向外查找。

当箭头函数定义在某个函数内部时,外层函数的 arguments 对象会出现在其作用域链上,因此箭头函数中的 arguments 直接指向外层函数的 arguments。这并非复制或传递,而是同一对象的引用。若箭头函数位于全局顶层,则不存在任何 arguments 绑定,访问会抛出 ReferenceError。

演示箭头函数访问外层 argumentsJavaScript
function outer(a, b) {
  const arrow = () => {
    console.log(arguments[0], arguments[1]);
  };
  arrow();
  return arguments.length;
}
console.log(outer('x', 'y'));
查看输出与解释
x y
2

箭头函数 arrow 内访问 arguments 相当于访问 outer 函数的 arguments 对象,因此输出 x y,并最终返回长度 2。

场景:回调中保留外层实参

假设有一个遍历函数 iterate,它接收任意参数,并在异步回调中全部打印。若用普通函数包裹 setTimeout,内层回调需要访问 iterate 的实参。若不使用箭头函数,可能写成 var self = this; var args = arguments; 等。使用箭头函数可以直接引用 arguments,但必须保证箭头函数定义在 iterate 内部。

实际执行时,iterate(1, 2) 会进入函数,内部 setTimeout 的回调是箭头函数,它捕获了外层 arguments。1 秒后输出 [1, 2]。改为剩余参数可避免这种隐式依赖,见下例,使函数更通用。

异步回调中使用 arguments 或...argsJavaScript
function demo() {
  setTimeout(() => {
    console.log(JSON.stringify(Array.from(arguments)));
  }, 0);
}
demo('a', 'b');

function demo2(...args) {
  setTimeout(() => {
    console.log(JSON.stringify(args));
  }, 0);
}
demo2(1, 2);
查看输出与解释
["a","b"]
[1,2]

第一个 demo 的回调引用外层 arguments,得到实参数组;第二个用剩余参数对象 args,效果相同但意图明确,且可避免某些便捷方法的误用。

边界:何时无法取到外层 arguments

若箭头函数不在任何普通函数体内,而是位于模块顶层或脚本全局,则 arguments 标识符不存在,访问即抛 ReferenceError。另外,即便在函数内,若该函数本身也是箭头函数,则需继续向外查找,直到普通函数或全局,容易造成混乱。

在严格模式下,普通函数内部 arguments 仍是可用的,但 arguments.callee 被禁用,因此不能通过 callee 递归。替代方案包括命名函数表达式或剩余参数。此外,arguments 对象按实际传入的实参构造,当使用默认参数或剩余参数时,它既不会体现默认参数的填充值,也不与剩余参数的数组对应,因此与形参列表可能不一致,增加出错风险。

回答前,多想一步

容易答错的地方

误以为箭头函数继承外层 this 也继承 arguments
箭头函数词法绑定 this 和 arguments 是独立的。arguments 同样按词法查找,但若内层有普通函数包裹,它会指向那个函数的 arguments,未必是最外层。
认为箭头函数可以用 call 传入 arguments
调用箭头函数用 call/apply 传参时,函数体内不会创建 arguments,传入的实参只能通过具名参数或剩余参数访问。箭头函数自身的 arguments 不受调用影响,仍是闭合词法作用域中的值。
试着用自己的话回答

面试官还会怎么问?

箭头函数内想要拿到自己的实参怎么办?

不能访问 arguments,应使用剩余参数。例如 (...args) => args。它提供真正的数组,并可安全传递。

外层普通函数直接 return 箭头函数,内部 arguments 会失效吗?

只要 return 的箭头函数定义在该普通函数体内,其 arguments 引用就始终合法,即使外层执行完毕后仍可通过闭包访问,不受调用栈影响。

在对象方法中定义箭头函数,arguments 指向谁?

若该对象方法是普通函数,则指向该方法的 arguments;若对象方法本身也是箭头函数或对象里用箭头函数定义属性,则继续向上查找;若外层无普通函数(如模块或全局顶层),则 arguments 不可用,访问会抛出 ReferenceError。

从一道题,走向一组知识

把知识连起来

函数与作用域

箭头函数中的 this 是如何决定的?为什么会词法绑定?

箭头函数的 arguments 和 this 均按词法绑定,理解 this 有助于类比 arguments 的查找规则。

函数与作用域

JavaScript 剩余参数(rest parameters)与 arguments 对象相比有哪些优势?

剩余参数是替代 arguments 的首选方案,两者的权衡与适用场景需要比较。

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

参考资料

  • Arrow function expressions

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

本题目录
  1. 先记住这个答案
  2. 机制:词法作用域如何影响 arguments
  3. 场景:回调中保留外层实参
  4. 边界:何时无法取到外层 arguments
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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