Legacy reflection features for functions in JavaScript S1
中文标题:JavaScript 中函数的遗留反射特性
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案标准化了 Function#caller 和 Function#arguments,这些是 Web 兼容性所需的已弃用特性。它规定了 Function.prototype 上的可删除 getter,仅限于特定的非严格函数,返回最后一次活动调用的调用者或 arguments 对象,否则返回 null。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
JavaScript 中函数的遗留反射特性
状态
ECMAScript 提案 处于流程的第 1 阶段。
- 主要作者:Claude Pache (@claudepache)
- 倡导者:Mark S. Miller (@erights)
ECMA-262 仓库上的讨论线程
目的
这是一个关于标准化 Function#caller 和 Function#arguments 的提案。
这些特性已被弃用(因为它们破坏了函数提供的封装),但对 Web 兼容性是必需的。因此,建议将它们添加到 Annex B(或 tc39/ecma262#1595 后续的任何内容)中。
设计原则
- 防止危险或不明智的行为。
- 避免提供对本来不可访问的对象的访问。由于其他限制,这对非严格函数不是强制性的。
- 避免跨领域泄漏。
- 弃用该功能。
- 抛出 TypeError 优于返回 null,而返回 null 又优于直接工作。
- 该功能可以在运行时轻松地从给定领域完全移除。
- 使特性小而自包含。
- API 表面尽可能小,对象的内部方法保持其默认行为。
- 避免使区分严格函数和非 ECMAScript 函数成为可能。
- 不要破坏 Web。
- 每个提议的行为应当要么由一种或多种主流浏览器当前实现,要么得到仔细论证。
- 避免实现者的工作。
- 仔细测试了实现当前的行为,以便它们只需要最少的修改。
规范
正式规范文本在 spec.md 中。以下是摘要:
-
在 Function.prototype 上安装了名为 "caller" 和 "arguments" 的两个可删除的 getter。它们受到限制,以便仅对来自匹配领域的非严格函数的子类别起作用:当尝试将它们与其他函数一起使用时,会抛出 TypeError。
-
"caller" getter(当应用于未审查的函数时)基于执行上下文堆栈返回函数最后一次当前活动调用的调用者,但仅当调用者位于匹配领域的非严格函数的某个子类别中时。否则返回 null。
-
"arguments" getter(当应用于未审查的函数时)返回一个 Arguments 对象,反映基于执行上下文堆栈的函数最后一次当前活动调用期间传递的参数。否则返回 null。
-
上述特性进入 Annex B,这意味着它们仅在 Web 浏览器中是必需的。
-
最后,实现不允许在本规范定义之外定义任何函数对象上的 "caller" 或 "arguments" 自有属性。
本规范与主流浏览器当前实现之间的差异
详细信息请参见 analysis.md。以下是摘要:
- Function#caller 和 Function#arguments 被规范化为 Function.prototype 上的可删除访问器。这与 Firefox 的做法一致;在撰写本文时,其他浏览器将它们定义为单个函数对象上的“魔法”不可变数据属性。
- 该规范防止跨领域泄漏。实现没有。
- 在规范中,.caller 可能返回的函数集是各主流浏览器中此类函数集的交集。
- 当被视为“调用者”的函数是非 ECMAScript 函数或严格函数时,该规范不会表现出可区分的行为。某些实现会。