2015-12-21 76 views
0

性能方面,使用函数数组注册一个单一事件来为每个需要调用的函数调用或只注册一个不同的事件会更好吗?我似乎无法对谷歌注册1个有很多通话或注册多个事件的事件?

找到答案

一个例子:
给了这些功能

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](); 
    } 
}); 

或本

$(window).on("resize", doA); 
$(window).on("resize", doB); 
$(window).on("resize", doC); 

我在这个例子中使用jQuery,但同样的事情可能是要求纯Javascript。

请注意,这只是一个例子,在我的真实应用程序中,函数/事件在执行过程中被动态添加/删除。

编辑:虽然我同意最好的方法是有一个函数调用其他的,这只是其他两种方法的例子,在其他情况下,也就是说当你不知道提前有多少功能可以用来监听一个事件。在这种情况下,最好是为每个函数设置一个监听器,或者创建一个可以完成调用的全局监听器?

+0

如果没有异步函数,这些函数中获取调用那么你为什么不只需拨打B A内部并调用C B里面,那么你可以有$(窗口).on(“resize”,doA); – mukund

+0

这只是一个例子,在我的真实应用程序中,函数/事件在执行期间被动态添加/删除。 – valepu

回答

0

通用设计原则,将表明:

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

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

是不是通过各功能循环更明智。这似乎是不必要的额外步骤&定义的变量。

+0

也许我应该指定需要执行的函数的数量/事件侦听器不是静态的,并且会在用户在网站上浏览网页 – valepu

0

与JBux一样,数组方法看起来像开销一样,也使得更难理解发生了什么。

表现明智,我认为在doAdoB ......中执行的操作更符合您的要求,而不是您需要的方式。

执行初始化和寄存器事件的常用方法是使用模块模式并使用init函数进行设置。

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

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

有趣的资源:http://addyosmani.com/largescalejavascript/

+0

时被添加/删除,但如果您事先不知道在事件期间需要调用哪些函数?让每个人都倾听还是被单个听众调用是更好的方法? – valepu

+0

最初单听者对我来说更有意义。 这将负责获取您要执行的操作并保持其集中的逻辑。 不同的听众可以工作,但以后可能更难以管理。 – thedev

+0

有关使用数组跟踪需要调用的函数的另一个想法。 这意味着你将在某些动作上改变数组并将其作为全局变量传递给它。 我会考虑在事件监听器(集中式逻辑)上获取一次操作列表,而不是每次用户执行某些操作时更改数组,如果您具有允许您确定要调用的函数的信息。 – thedev