前端手写代码面试题
目录

实现一个函数 once(fn),确保函数只执行一次

· 约 3 分钟读完 · 第 32 / 125 章

推荐答案

本题详细解读

问题分析

我们需要实现一个函数 once(fn),它接受一个函数 fn 作为参数,并返回一个新的函数。这个新函数在被调用时,只会执行一次 fn,后续的调用将直接返回第一次执行的结果。

实现思路

  1. 闭包的使用:我们需要使用闭包来保存一个状态变量 called,用于记录 fn 是否已经被调用过。
  2. 状态变量:called 是一个布尔值,初始值为 false,表示 fn 还未被调用。当 fn 被调用后,called 被设置为 true。
  3. 结果缓存:我们还需要一个变量 result 来保存 fn 的执行结果,以便在后续调用时直接返回。
  4. 函数返回:返回的新函数在每次调用时,首先检查 called 的状态。如果 called 为 false,则调用 fn 并将结果保存到 result 中,然后将 called 设置为 true。如果 called 为 true,则直接返回 result。

代码解释

  • let called = false;:初始化 called 为 false,表示 fn 还未被调用。
  • let result;:初始化 result 用于保存 fn 的执行结果。
  • return function(...args) { ... }:返回一个新函数,这个函数接受任意数量的参数。
  • if (!called) { ... }:检查 called 是否为 false,如果是,则执行 fn 并将结果保存到 result 中,然后将 called 设置为 true。
  • return result;:返回 result,无论 fn 是否被调用过。

示例

在这个示例中,myFunctionOnce 只会执行一次 myFunction,后续调用直接返回第一次执行的结果 42。