2012-11-08 153 views
1

我想用coffeescript管理我的部分佈局。我有一個左/右面板,我希望能夠在它們之間切換。我創建了這樣的事情:Coffeescript - 變量調用函數

window.switchPanel = (panel = 'left', action = 'toggle') -> 

    open = (panel) -> 
    ... 

    close = (panel) -> 
    ... 

    toggle = (panel) -> 
    ... 

我的問題是,如何組織,這樣我可以通過action變量調用open/close/toggle,我可以使用的東西,這樣我就不必在panel傳遞到每個孩子的功能?也許@panel

+0

由於您要傳遞操作名稱,爲什麼不直接將函數直接附加到窗口(或連接到窗口的面板對象)?你有1個函數名+2個非可選動作名,我認爲它不比3個函數名更好 – Guillaume86

回答

4

我想你只想把你的功能集成到一個對象,以便您可以通過名稱訪問它們:

window.switchPanel = (panel = 'left', action = 'toggle') -> 
    funcs = 
    open: (panel) -> 
     ... 
    close: (panel) -> 
     ... 
    toggle: (panel) -> 
     ... 

那麼你可以簡單funcs[action](panel)switchPanel。如果你不想通過panel進入功能,那麼你不必,他們將有機會獲得panel簡單地通過內switchPanel被定義:

window.switchPanel = (panel = 'left', action = 'toggle') -> 
    funcs = 
    open: -> 
     ... 
    close: -> 
     ... 
    toggle: -> 
     ... 

那麼你只是funcs[action](),他們可以做他們喜歡什麼panel

演示:http://jsfiddle.net/ambiguous/UV42x/

JavaScript closures一些閱讀會澄清這是怎麼回事的第二個版本。

您可能希望包含if(action !of funcs)檢查以確保您不會嘗試使用不良的action。或者,如評論中的Aaron Dufour筆記,如果您只需檢查action有效一次,則可以funcs[action]?()

+1

您可以使用'funcs [action]?()',而不是您的'if fun!of funcs'來檢查,這有點多coffeescript-y。另外,值得注意的是,如果OP想要了解更多關於它是如何工作的,那麼動作函數可以通過閉包訪問'panel'。 –

+0

@AaronDufour:如果'action'不存在,取決於你想要做什麼。如果你只是想忽略它,那麼'funcs [action]?()'可以工作,但如果你想產生一個錯誤信息或立即返回以避免進一步的'action'檢查,那麼'if ...!of'會更好。但是,加入*封閉*術語是有道理的。 –

+0

謝謝!這會做。 –

0

幾件事情:

1)我認爲你是通過基於輸入到該對象的對象中選擇調用方法創建obvuscated架構。它提出了一個問題:「爲什麼要創建方法?爲什麼不使用大的IF ELSE IF類型結構?」但其他人會不同意我的看法。

2)這是CoffeeScript令人困惑的情況之一。你正在處理的是如果用明確的大括號包裝,通常會清楚的事情。我不喜歡JavaScript在各處瘋狂地使用匿名函數包裝,但我確實相信括號內的代碼。我推遲到第1點。我認爲你只是通過這樣做讓事情變得更加複雜。

3)你有沒有研究過coffeescript如何轉換'this'關鍵字?我非常確定CoffeeScript對'this'做了一些與標準javascript不同的巧妙轉換,這意味着除咖啡用戶外,沒有人能爲你回答這個問題。它不會像JavaScript一樣。它的相關之處在於,爲了在方法中訪問「面板」而不明確傳遞方法,您需要使用「this.panel」或其他一些解引用機制從一種方法中訪問面板成員。我無法告訴你如何,但是我的幫助引導你正確的方向。當前的問題顯然是如何引用對象成員的問題。

+0

我將塊分成函數,因爲例如切換將使用打開/關閉函數。這是幹代碼。 –

+0

我想我可以在if/else語句中包裝函數調用。無論哪種方式,這不是問題。無論如何感謝您的意見。 –

+0

要點1:我認爲通過使用對象引用函數而不是大量的if if if可以更好地維護對象。點2和3對我來說看起來不對,這個問題對於純javascript來說幾乎是一樣的。 – Guillaume86