当前位置:首页 > JavaScript

js实现函数监听

2026-02-03 02:33:10JavaScript

函数监听的基本方法

在JavaScript中,可以通过多种方式实现函数监听,主要包括原生事件监听、自定义事件和函数包装等。以下是几种常见的实现方式:

使用addEventListener

适用于DOM元素的事件监听,例如点击、键盘输入等:

document.getElementById('myButton').addEventListener('click', function() {
    console.log('Button clicked');
});

自定义事件监听

通过EventTarget接口创建自定义事件,适用于非DOM对象的监听:

const eventTarget = new EventTarget();
eventTarget.addEventListener('customEvent', (e) => {
    console.log('Custom event triggered', e.detail);
});

// 触发事件
eventTarget.dispatchEvent(new CustomEvent('customEvent', { detail: { data: 'example' } }));

函数包装监听

通过高阶函数包装原函数,在调用前后执行监听逻辑:

function originalFunction() {
    console.log('Original function executed');
}

function withListener(fn, before, after) {
    return function() {
        before && before();
        const result = fn.apply(this, arguments);
        after && after();
        return result;
    };
}

const wrappedFunction = withListener(
    originalFunction,
    () => console.log('Before execution'),
    () => console.log('After execution')
);

wrappedFunction();

Proxy代理监听

使用ES6的Proxy对象监听函数调用:

const targetFunction = function() {
    console.log('Target function called');
};

const proxiedFunction = new Proxy(targetFunction, {
    apply: function(target, thisArg, argumentsList) {
        console.log('Function is about to be called');
        const result = target.apply(thisArg, argumentsList);
        console.log('Function has been called');
        return result;
    }
});

proxiedFunction();

发布-订阅模式

实现一个简单的发布-订阅系统,适用于多个监听器的情况:

js实现函数监听

class EventEmitter {
    constructor() {
        this.events = {};
    }

    on(event, listener) {
        if (!this.events[event]) {
            this.events[event] = [];
        }
        this.events[event].push(listener);
    }

    emit(event, ...args) {
        if (this.events[event]) {
            this.events[event].forEach(listener => listener(...args));
        }
    }
}

const emitter = new EventEmitter();
emitter.on('functionCalled', () => console.log('Function was called'));
emitter.emit('functionCalled');

注意事项

  • 对于DOM事件监听,记得在适当的时候使用removeEventListener移除监听,避免内存泄漏
  • Proxy方法在性能要求高的场景可能需要谨慎使用
  • 发布-订阅模式适合组件间通信或复杂的事件系统
  • 函数包装方式会改变原函数的引用,可能影响其他依赖该引用的代码

标签: 函数js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…