当前位置:首页 > JavaScript

js实现once

2026-04-06 09:57:43JavaScript

实现 once 函数

在 JavaScript 中,once 函数用于确保某个函数只能被调用一次,后续调用不再执行。以下是几种实现方式:

js实现once

闭包实现

通过闭包保存一个标志位,记录函数是否已被调用:

js实现once

function once(fn) {
  let called = false;
  return function(...args) {
    if (!called) {
      called = true;
      return fn.apply(this, args);
    }
  };
}

函数属性实现

利用函数对象的属性来存储调用状态:

function once(fn) {
  return function(...args) {
    if (!fn.called) {
      fn.called = true;
      return fn.apply(this, args);
    }
  };
}

ES6 Proxy 实现

使用 Proxy 拦截函数调用:

function once(fn) {
  let called = false;
  return new Proxy(fn, {
    apply(target, thisArg, args) {
      if (!called) {
        called = true;
        return Reflect.apply(target, thisArg, args);
      }
    }
  });
}

使用示例

const logOnce = once(console.log);
logOnce("Hello"); // 输出 "Hello"
logOnce("World"); // 无输出

注意事项

  • 如果函数需要绑定特定的 this 上下文,确保使用 applycall 正确传递。
  • 如果需要支持异步函数,上述实现同样适用,因为 Promise 会保持返回值的引用。

标签: jsonce
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…