在过去的几年中,我一直使用YUI支持的JavaScript名称空间作为格式化JavaScript代码的默认方式。
总而言之,它在更复杂的环境中效果很好,在这种环境中,许多Web窗口小部件可能在不同的时间粘在一起。
直到最近,我几乎总是通过从名称分隔的对象本身调用处理程序来在HTML中使用添加的事件处理程序。
我最近一直在使用JQuery,并且已在ready函数而不是HTML中设置处理程序。
随着我做的越来越多,似乎JQuery ready函数的关闭正在代替名称空间对象。
我现在要结束的事情(至少对于一个小部件/工具类型的页面而言)是一个主要处理数据的名称空间对象和一堆关闭的事件处理程序,我可以出于特定的数据目的访问名称空间对象。
我的问题是,处理闭包和名称空间对象(尤其是与事件处理程序有关)的最佳实践是什么?
或者,类似地,设置事件处理程序的最佳实践是什么,如果它们“沉重”并自己处理,或者交给更多类似代码的库。
就个人而言,很难跟踪许多单独的“重磅”事件处理程序的流程。
最佳答案
这是一个非常主观的问题。话虽这么说,我会尽我所能,给出每种方法的利弊。
命名空间对象:
yourNamespace.events.someClickHandler = function(event) {...}
$(function() {
$("#someElement").click(yourNamespace.events.someClickHandler);
}
这种方法的第一个“缺点”之一是将事件处理程序与其连接分离。您可以通过在定义每个事件后对其进行挂接来避免这种情况(就像我在上面的示例中所做的那样),但是随后在整个代码中都会出现很多“ $(function(){”)行。
这种样式的另一个“缺点”是事件处理程序的长名称(例如,“ yourNamespace.events.someClickHandler”)。您可以使用别名:
var events = yourNamespace.events;
$("#someElement").click(events.someClickHandler);
和较短的名称空间名称来缓解这种情况,但是实际上没有办法解决它。
因此,鉴于所有这些缺点,为什么有人会使用命名空间模式?好吧,它的一个“优点”是事件是可访问的。假设(出于调试目的)您要记录传递给点击处理程序的事件对象。使用Firebug,您可以执行以下操作:
var oldHandler = yourNamespace.events.someClickHandler;
var newHandler = function(e) {console.log(e); oldHandler(e);}
$("#someElement").unbind("click");
$("#someElement").click(yourNamespace.events.someClickHandler);
而且,即使不刷新页面,也可以记录事件。
同样,这种样式还有另一个可重用性。如果要创建一个与旧的单击处理程序相似的新单击处理程序,但同时也要创建x,y和z,则可以执行以下操作:
yourNamespace.events.advancedClickHandler = function(event) {
yourNamespace.events.someClickHandler(e);
x(); y(); z();
}
现在相比之下,我们具有“关闭”样式(我更喜欢将其称为“匿名函数”样式)。
$(function() {
$("#someElement").click(function(event) {...});
}
显然,它更简洁,处理程序的定义尽可能接近于连接,并且我认为它甚至使用了很少的内存,因为没有变量引用。但是,您将无法进行任何实时调试工作,也无法将该处理程序挂接到其他任何地方,也无法将其扩展到某些新的处理程序中,或者类似的事情,因为您的处理程序仅暂时存在当您将其连接起来时。
因此,希望有帮助。以我的经验,名称空间对象样式通常是首选的方法,尤其是JS项目的核心/严肃性更高。但是它肯定有一些缺点。目前,在JS中确实没有完美的(即,完全干净/可重复使用的)挂钩事件的方法。
关于javascript - 在 namespace 对象或闭包中将事件处理程序代码保存在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1015300/