once
创建只能执行一次的函数,后续调用返回第一次的结果。
函数签名
typescript
function once<T extends (...args: any[]) => any>(fn: T): T参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
fn | Function | 是 | 原函数 |
返回值
| 类型 | 说明 |
|---|---|
T | 只执行一次的函数,保持原函数的类型签名 |
工作原理
- 使用闭包保存两个状态:
called: 是否已调用过result: 第一次调用的结果
- 返回包装函数:
- 检查
called标志 - 如果未调用过:
- 执行原函数
- 保存结果到
result - 设置
called为 true
- 如果已调用过:
- 直接返回缓存的
result
- 直接返回缓存的
- 检查
- 确保原函数只执行一次
示例:
typescript
const initialize = once(() => {
console.log('初始化')
return 'initialized'
})
initialize() // 输出 "初始化",返回 "initialized"
initialize() // 不输出,返回 "initialized"适用于初始化函数、配置加载等只需执行一次的场景。