Javascript 用多个调用注册一个事件还是注册多个事件?

Javascript 用多个调用注册一个事件还是注册多个事件?,javascript,performance,dom-events,Javascript,Performance,Dom Events,就性能而言,最好是使用要调用的函数数组注册单个事件,还是只为需要调用的每个函数注册不同的事件?我似乎在谷歌上找不到答案 例如: 鉴于这些功能 function doA(){ /* do A */}; function doB(){ /* do B */}; function doC(){ /* do C */}; 这样做更好吗 var funcs=[]; funcs.push(doA); funcs.push(doB); funcs.push(doC); $(window).on("resiz

就性能而言,最好是使用要调用的函数数组注册单个事件,还是只为需要调用的每个函数注册不同的事件?我似乎在谷歌上找不到答案

例如:
鉴于这些功能

function doA(){ /* do A */};
function doB(){ /* do B */};
function doC(){ /* do C */};
这样做更好吗

var funcs=[];
funcs.push(doA);
funcs.push(doB);
funcs.push(doC);
$(window).on("resize", function(){
    for(var i=0; i<funcs.length; i++){
        funcs[i]();
    }
});
在本例中,我使用jQuery,但对于纯Javascript,可能会要求执行同样的操作


请注意,这只是一个示例,在我的实际应用程序中,函数/事件是在执行期间动态添加/删除的


编辑:虽然我同意最好的方法是使用一个调用其他函数的函数,但这只是在其他情况下必须使用的其他两种方法的一个示例,即当您事先不知道有多少函数将侦听事件时。在这种情况下,是否最好为每个函数设置一个侦听器,或者创建一个执行调用的全局侦听器?

通用设计原则建议:

smallFunc1(string) {}
smallFunc2(string) {}

bigFunc1(string) {
    smallFunc1(string);
    smallFunc2(string);
}

比循环使用每个函数更明智。这似乎是不必要的额外步骤&定义的变量

同意JBux的观点,数组方法似乎是一种开销,也使得理解发生了什么变得更加困难

就性能而言,我认为在
doA
doB
中执行的操作。。。更相关,而不是你所说的必要

初始化和注册事件的常用方法是使用模块模式并使用
init
函数进行设置

function library(module) {
  $(function() {
    if (module.init) {
      module.init();
    }
  });
  return module;
}

var myLibrary = library(function() {
   return {
     init: function() {
       /*implementation*/
     }
   };
}());

有趣的资源:

如果在这些函数中没有异步函数被调用,那么为什么不在A中调用B,在B中调用C,那么就可以使用$(window).on(“resize”,doA);这只是一个例子,在我的实际应用程序中,函数/事件是在执行过程中动态添加/删除的。也许我应该指定需要执行的函数/事件侦听器的数量不是静态的,而是在用户浏览站点时添加/删除的。OK,但是如果您事先不知道在事件期间需要调用哪些函数呢?是让每个人都有一个听者,还是由一个听者来调用更好?一开始,单个听者对我来说更有意义。这将负责获取您想要执行的操作并保持其集中化的逻辑。不同的侦听器可以工作,但以后可能更难管理。关于使用数组跟踪需要调用的函数的另一个想法。这意味着您将更改某些操作上的数组,并将其作为全局变量传递给?我会考虑在事件侦听器(集中逻辑)上获得一次动作列表,而不是每次用户做某事时改变数组,如果您有允许您确定要调用哪些函数的信息。我不想在这个问题中添加无用的细节,但我在一个角度应用中这样做。我已经做了一个服务,跟踪窗口的高度并处理调整大小事件(取消公告)。该服务包含一个对象(不是数组)以及他需要调用的所有函数,指令可以注册到该服务(并将获得一个id),然后当它被删除时,它将触发一个$scope.on(“$destroy”)事件,在该事件中它将从服务中注销,从回调列表对象中删除该函数
function library(module) {
  $(function() {
    if (module.init) {
      module.init();
    }
  });
  return module;
}

var myLibrary = library(function() {
   return {
     init: function() {
       /*implementation*/
     }
   };
}());