我想用coffeescript管理部分布局。我有一个左/右面板,我希望能够在它们之间切换。我创造了这样的东西:
window.switchPanel = (panel = 'left', action = 'toggle') ->
open = (panel) ->
...
close = (panel) ->
...
toggle = (panel) ->
...
我的问题是,如何对此进行结构化以便我可以通过open/close/toggle
变量调用action
并且可以使用某些内容以便我无需传递{{1}每个孩子的功能?也许是panel
?
答案 0 :(得分: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注释,如果您只需检查funcs[action]?()
是否有效,则可以action
。
答案 1 :(得分:0)
少数事情:
1)我认为你是通过根据对象的输入选择性地调用对象内的方法来创建混淆的体系结构。它引出了一个问题“为什么甚至创建方法?为什么不使用一个大的IF ELSE IF类型结构呢?”但其他人不同意我的看法。
2)这是CoffeeScript令人困惑的情况之一。如果用明显的括号包裹,你正在处理通常很清楚的事情。我不喜欢javascript在任何地方疯狂使用匿名函数包装器,但我确实相信括号中的代码。我倾向于第1点。我认为你只是通过这种方式让事情变得更复杂。
3)您是否研究过coffeescript如何转换'this'关键字?我非常肯定CoffeeScript会对'this'做一些与标准javascript不同的智能转换,这意味着没有人可以为你解答这个问题,除了咖啡用户。它与javascript不同。它的相关性是因为为了在不明确传递方法的情况下访问方法中的“面板”,您需要使用“this.panel”或其他一些解除引用机制来从其中一个方法中访问面板成员。我无法告诉你如何,但这些信息可以帮助你指引正确的方向。手头的问题显然是如何引用对象成员的问题。