【问题标题】:why to implement callbacks and event handler attachment using javascript closures?为什么要使用 javascript 闭包实现回调和事件处理程序附件?
【发布时间】:2026-01-30 23:50:01
【问题描述】:

通过在 JavaScript 中使用闭包来实现回调和事件处理程序附件,我们可以获得什么价值。我知道 jQuery 广泛使用这种模式,但想了解为什么?

【问题讨论】:

  • 您认为有什么选择?

标签: javascript jquery closures


【解决方案1】:

将闭包分配为回调使您可以访问定义它的范围。它还有助于保持命名空间清洁。其他库允许您将对象方法绑定为事件处理程序,让事件访问对象,这是一个非常优雅的替代解决方案。例如,可能是这样的:

// an object definition
var Accordion = function () {
   this.clickCounter = 0;
};
Accordion.prototype.click = function () {
   this.clickCounter += 1;
   alert( this.clickCounter );
};

// create object
var myAccordion = new Accordion();

// function to bind DOM element events to javascript object methods
function methodBind ( element, eventType, myObject, myMethod ) {
   $( element ).bind( eventType, function(e) {
      e.preventDefault();
      myObject[myMethod ].call(myObject);
   } );
}

// bind buttons on an element to activate a correlating object method
$( '.Accordion' ).find( '.button' ).each( function() {
   methodBind( this, 'click', myAccordion, 'click' );
} );

虽然我的实现也使用了闭包哈哈。

【讨论】:

    【解决方案2】:

    是的,你可能会像 Esailija 所描述的那样结束,但你也可能会救一些小猫。闭包中的事件处理程序使您可以访问本地范围。所以不是

    var uselessMap = {};
    
    function myListener(e) {
        alert(uselessMap[e.target.id].foo);    
    }
    
    items.forEach(function(item) {
        var el = document.createElement('div');
        el.innerText = item.name;
        el.id = item.id;
        el.addEventListener('click', myListener, false);
    })
    

    你只需要这个:

    items.forEach(function(item) {
        var el = document.createElement('div');
        el.innerText = item.name;
        el.addEventListener('click', function(e) {
            alert(item.foo);
        }, false);
    })
    

    【讨论】:

      【解决方案3】:

      我不确定是否真正了解您的需求。 Closures 不是 jQuery 系统,它是主要的核心或 Javascript。

      问题是 Javascript 是一种基于事件的语言。当您进行 ajax 调用时,您的 javascript 将继续运行并且不会停止期待结果。所以你需要有一个回调方法才能在完成后做某事。

      我知道当你使用像 PHP 这样的阻塞语言调用一个函数并在操作完成后执行下面的行时,这可能会令人沮丧。但这是 Javascript 哲学。当你可以做其他事情时不要等待,当这个或这个事件被调用时能够弹出。

      通常,对于单击/更改输入/提交表单等事件,您不能等待并阻止所有代码,直到某些操作弹出。因此,为您想听到的每个事件添加一个监听器并继续您的方式。

      【讨论】:

      • 我知道你在说 javascript 是基于事件的,我也知道闭包是 vanilla javascript 的一部分。我基本上是在询问闭包在实现回调时的价值。例如,在实现回调的同时保留已经完成的执行上下文的环境,我们可以获得什么价值。
      • 这就是范围系统。如果你在定义回调时在一个对象中,没有这个系统,你将无法回到你的对象而不定义一个丑陋的全局变量重新组合所有实例。
      最近更新 更多