推荐答案
-- -------------------- ---- ------- -------- -------- - --- ------ - ------ --- ------- ------ ----------------- - -- --------- - ------ - ----- ------ - -------------- ------ - ------ ------- -- -
本题详细解读
问题分析
我们需要实现一个函数 once(fn)
,它接受一个函数 fn
作为参数,并返回一个新的函数。这个新函数在被调用时,只会执行一次 fn
,后续的调用将直接返回第一次执行的结果。
实现思路
- 闭包的使用:我们需要使用闭包来保存一个状态变量
called
,用于记录fn
是否已经被调用过。 - 状态变量:
called
是一个布尔值,初始值为false
,表示fn
还未被调用。当fn
被调用后,called
被设置为true
。 - 结果缓存:我们还需要一个变量
result
来保存fn
的执行结果,以便在后续调用时直接返回。 - 函数返回:返回的新函数在每次调用时,首先检查
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
。