2011-03-20 34 views
0

我已經讀過,在javascript中不使用太多全局變量是一個好習慣,所以我試圖打包一些與導航按鈕有關的函數我在這樣的單個變量的應用程序:當從一個對象中調用其他方法時默認執行一個javascript'方法'

var navs = { 
    projects: function(){ 
    main.removeClass().addClass('showing_projects'); 
    //... other code 
    }, 
    line_items: function(){ 
    main.removeClass().addClass('showing_line_items'); 
    //... other code 
    }, 
    media:  function(){ 
    main.removeClass().addClass('showing_media'); 
    //... other code 
    } 
} 

所以,我可以做

navs.projects() 

顯示項目。我的問題是,我有這個函數showNotify(),我需要在調用任何navs.projects(),navs.line_items()或navs.media()之後運行。我覺得將這個showNotify()行添加到這三個屬性/方法中的每一個都不是DRY。有沒有辦法讓showNotify()每次運行這三個方法時都可以運行?

謝謝

回答

0

你可以參數各是不同的那些功能的部分:像這樣使用

var navs = { 
    addClassAndNotify: function(className, fn) { 
     main.removeClass().addClass(className); 
     fn(); 
     showNotify(); 

    } 
} 

和:

navs.addClassAndNotify('showing_media', function() { 
    // showing media code 
}); 

你也可以創建一個函數發生器,就像這樣:

function create(className, fn) { 
    return function() { 
     main.removeClass().addClass(className); 
     fn(); 
     showNotify(); 
    } 
} 

然後創建你的這樣的功能:

var navs = { 
    projects: create(function(){ 
     //... other code 
    }), 
    line_items: create(function(){ 
     //... other code 
    }), 
    media: create(function(){ 
     //... other code 
    }), 
} 

但我不認爲在每個函數中調用showNotify是一件大事。

+0

我喜歡參數化的想法。謝謝! – 2011-03-21 21:56:17

0

這是不幹燥的違規添加showNotify()對每種方法的結束。違反DRY將複製/粘貼showNotify()的內容而不是調用它。

據我所知,沒有辦法比添加電話來實現您的目標更簡潔。即使有,這樣做也是一個非常糟糕的主意,因爲調用這些函數會對閱讀代碼的人產生一些效果。

+0

感謝您的輸入,至少我可以感覺好一點,如果我不得不重複調用函數中的某個函數,而這些函數本身並不相似,那麼函數並不總是不幹。 – 2011-03-21 21:57:26

相關問題