JS 只让函数触发一次的方法

在 JavaScript 中,可以通过以下几种方法实现让一个函数只触发一次:

一、使用标志变量

javascript 复制代码
let hasTriggered = false;
function myFunction() {
  if (!hasTriggered) {
    // 执行函数逻辑
    console.log('Function triggered for the first time.');
    hasTriggered = true;
  }
}

二、使用闭包

javascript 复制代码
const onceFunction = (function () {
  let hasTriggered = false;
  return function () {
    if (!hasTriggered) {
      // 执行函数逻辑
      console.log('Function triggered for the first time.');
      hasTriggered = true;
    }
  };
})();

三、使用立即调用函数表达式(IIFE)结合闭包

javascript 复制代码
const myFunction = (function () {
  let triggered = false;
  return function () {
    if (!triggered) {
      console.log('Function triggered for the first time.');
      triggered = true;
    }
  };
})();

四、借助事件监听器的once选项(如果在特定事件场景下)

如果是在处理事件的场景下,可以使用事件监听器的once选项来确保处理函数只执行一次。

javascript 复制代码
const element = document.getElementById('myElement');
element.addEventListener('click', function handleClick() {
  // 执行函数逻辑
  console.log('Function triggered for the first time.');
}, { once: true });

除了以上三种方法,还有其他方法可以让函数只触发一次吗?

以下是另一种方法来实现让函数只触发一次:

利用代理对象

javascript 复制代码
function myFunction() {
  console.log('Function triggered for the first time.');
}

const proxyHandler = {
  apply: function (target, thisArg, args) {
    const result = Reflect.apply(target, thisArg, args);
    // 修改函数自身,使其变为一个空函数,确保后续调用不执行任何操作
    thisArg.myFunction = function () {};
    return result;
  },
};

const obj = {
  myFunction: myFunction,
};

const proxyObj = new Proxy(obj, proxyHandler);

proxyObj.myFunction();
proxyObj.myFunction(); // 不会再有输出

在这个方法中,使用了代理对象来拦截函数的调用。当函数第一次被调用时,执行原始函数的逻辑,然后修改函数自身为一个空函数,这样后续的调用就不会执行任何操作了。

相关推荐
梦里寻码2 分钟前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing034 分钟前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光6 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
SameX14 分钟前
HarmonyOS ArkUI Dialog 复用 用 @CustomDialog + enum type 做多类型统一管理的做法
前端
starzy199027 分钟前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
AiMan31 分钟前
豆包爱学还是不可以导出左侧所有对话,只能单容导出,方法不对吗
前端
Sakura_j_h_37 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
无懈可击1 小时前
Vue 可视化AI表单设计器 FcDesigner v3.6 版本发布,支持导出 SQL功能!
vue.js·开源·ai编程
AiMan1 小时前
Grok生成的内容能否下载吗?
前端
徐小夕1 小时前
JitArchives,一款基于JitWord协同AI文档打造的企业级电子档案系统
前端·vue.js·github