Skip to content

once

创建只能执行一次的函数,后续调用返回第一次的结果。

函数签名

typescript
function once<T extends (...args: any[]) => any>(fn: T): T

参数

参数名类型必填说明
fnFunction原函数

返回值

类型说明
T只执行一次的函数,保持原函数的类型签名

工作原理

  1. 使用闭包保存两个状态:
    • called: 是否已调用过
    • result: 第一次调用的结果
  2. 返回包装函数:
    • 检查 called 标志
    • 如果未调用过:
      • 执行原函数
      • 保存结果到 result
      • 设置 called 为 true
    • 如果已调用过:
      • 直接返回缓存的 result
  3. 确保原函数只执行一次

示例

typescript
const initialize = once(() => {
  console.log('初始化')
  return 'initialized'
})

initialize()  // 输出 "初始化",返回 "initialized"
initialize()  // 不输出,返回 "initialized"

适用于初始化函数、配置加载等只需执行一次的场景。