推荐答案
// www.javascriptcn.com code example
function once(fn) {
let called = false;
let result;
return function(...args) {
if (!called) {
called = true;
result = fn.apply(this, args);
}
return result;
};
}本题详细解读
问题分析
我们需要实现一个函数 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是否被调用过。
示例
// www.javascriptcn.com code example
const myFunction = () => {
console.log('Function executed');
return 42;
};
const myFunctionOnce = once(myFunction);
console.log(myFunctionOnce()); // 输出: Function executed 和 42
console.log(myFunctionOnce()); // 输出: 42在这个示例中,myFunctionOnce 只会执行一次 myFunction,后续调用直接返回第一次执行的结果 42。