通过在 JavaScript 中使用闭包来实现回调和事件处理程序附件,我们可以获得什么价值。我知道 jQuery 广泛使用这种模式,但想了解为什么?
问问题
281 次
3 回答
2
将闭包分配为回调使您可以访问定义它的范围。它还有助于保持命名空间清洁。其他库允许您将对象方法绑定为事件处理程序,让事件访问对象,这是一个非常优雅的替代解决方案。例如,也许是这样的:
// 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' );
} );
虽然我的实现也使用了闭包哈哈。
于 2012-06-12T17:23:51.380 回答
0
是的,你可能会像 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);
})
于 2012-06-12T11:41:54.753 回答
0
我不确定是否真正了解您的需求。Closures 不是 jQuery 系统,它是主要的核心或 Javascript。
问题是 Javascript 是基于语言事件的。当您进行 ajax 调用时,您的 javascript 将继续运行并且不会停止期待结果。因此,您需要有一个回调方法才能在完成后执行某些操作。
我知道当你使用像 PHP 这样的阻塞语言调用一个函数并在操作完成时执行下面的行时,这可能会令人沮丧。但这是 Javascript 哲学。当你可以做其他事情时不要等待,只要能够在调用此或此事件时弹出即可。
通常,对于单击/更改输入/提交表单等事件,您不能等待并阻止所有代码,直到某些操作弹出。因此,请为您想听到的每个事件附加一个侦听器并继续您的方式。
于 2012-06-12T11:42:36.647 回答