返回

JavaScript 中 Once 函数的简洁实现:用闭包追踪执行次数

前端

拥抱简单:使用闭包打造 Once 函数

大家好,今天我们来解一道前端面试题:实现一个名为 once 的函数,让传入函数只执行一次。各位准备好了吗?那我们就开始吧!

首先,我们来思考一下如何实现这个功能。直觉告诉我们,我们需要一种方法来追踪函数是否已经被执行过。闭包在这里派上用场了!闭包允许我们访问函数内部的变量,即使函数已经执行完毕。

以下是如何使用闭包实现 once 函数的:

const once = (fn) => {
  // 闭包函数
  let executed = false;
  let result;

  return (...args) => {
    // 如果函数还没有被执行过
    if (!executed) {
      // 执行函数并存储结果
      result = fn(...args);
      executed = true;
    }

    // 返回存储的结果
    return result;
  };
};

现在,让我们分解一下代码:

  1. 闭包变量: 我们定义了两个闭包变量:executed 用于追踪函数是否被执行过,result 用于存储函数的返回值。
  2. 返回的函数: 我们返回了一个匿名函数,它接收任意数量的参数(...args)。
  3. 函数内部逻辑: 如果 executedfalse,则表示函数还没有被执行过。在这种情况下,我们调用原始函数 fn 并将结果存储在 result 中。然后将 executed 设置为 true 以表示函数已经执行过。
  4. 返回结果: 无论 executed 的值如何,我们始终返回存储在 result 中的结果。

示例用法:

让我们用一个示例来说明 once 函数的用法:

const logOnce = once((message) => console.log(message));

logOnce("第一次调用"); // 输出: "第一次调用"
logOnce("第二次调用"); // 输出: "第一次调用"
logOnce("第三次调用"); // 输出: "第一次调用"

正如你所看到的,logOnce 函数只被执行了一次,即使它被调用了多次。

结尾:

通过利用闭包的强大功能,我们已经成功实现了 once 函数。这种模式在需要确保函数只执行一次的情况下非常有用。希望这次探索能帮助你加深对 JavaScript 中闭包和函数作用域的理解。下次遇到类似的面试题时,你就可以自信满满地解决啦!