当前位置:首页 > 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();

发布-订阅模式

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

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
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

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

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现复制

js实现复制

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

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…