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

推荐答案

-- -------------------- ---- -------
-------- -------- -
  --- ------ - ------
  --- -------
  ------ ----------------- -
    -- --------- -
      ------ - -----
      ------ - -------------- ------
    -
    ------ -------
  --
-

本题详细解读

问题分析

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

实现思路

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

代码解释

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

示例

-- -------------------- ---- -------
----- ---------- - -- -- -
  --------------------- -----------
  ------ ---
--

----- -------------- - -----------------

------------------------------ -- --- -------- -------- - --
------------------------------ -- --- --

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

纠错
反馈