Function once S1
中文标题:JavaScript 的 Function.prototype.once
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
本提案标准化了 Function.prototype.once 方法,确保函数最多被调用一次,后续调用返回第一次的结果。它解决了 JavaScript 中一次性回调的常见需求。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
用于 JavaScript 的 Function.prototype.once
ECMAScript Stage-1 提案。2022。
联合发起人:Hemanth HM;J. S. Choi。
理由
确保回调只执行一次(无论回调被调用多少次)通常是很有用的。为此,开发者经常使用“once”函数,这些函数包装回调并确保它们最多被调用一次。本提案将在语言核心中标准化这样一个 once 函数。
描述
Function.prototype.once 方法将创建一个新函数,该函数最多调用一次原始函数,无论新函数被调用多少次。此调用中给出的参数会被传递给原始函数。对创建的函数任何后续调用都将返回第一次调用的结果。
实际示例
以下代码已被改编以使用本提案。
来自 execa@6.1.0:
来自 glob@7.2.1:
来自 Meteor@2.6.1:
来自 cypress@9.5.2:
先例和 Web 兼容性
有一个流行的 NPM 库,名为 once,它允许猴子补丁,这可能引发对 Function.prototype.once 的 Web 兼容性的担忧。
然而,自其第一个公开版本以来,once 库的猴子补丁仅是可选启用的。该猴子补丁不是条件性的,并且该库不存在实际的 Web 兼容性风险。
来自库的其他流行的 once 函数(例如,lodash.once、Underscore 和 onetime)也不使用条件猴子补丁。
对 !Function.prototype.once 的代码搜索(例如 if (!Function.prototype.once) { /* 猴子补丁 */ })在任何索引的开源代码中也没有给出结果。在生产代码中条件性地向 Function.prototype 进行 monkey-patching 一个 once 方法是不太可能的。