2015-12-21 128 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