2

我想用咖啡脚本管理我的部分布局。我有一个左/右面板,我希望能够在它们之间切换。我创造了这样的东西:

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

  open = (panel) ->
    ...

  close = (panel) ->
    ...

  toggle = (panel) ->
    ...

我的问题是,我如何构造它以便我可以open/close/toggle通过action变量调用并且我可以使用一些东西,这样我就不必将它传递panel给每个子函数?也许@panel

4

2 回答 2

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 闭包的阅读将阐明第二个版本中发生了什么。

您可能需要包含一个if(action !of funcs)检查以确保您不会尝试使用 bad action. 或者,正如Aaron Dufour在评论中指出的那样,funcs[action]?()如果您只需要检查action一次是否有效,您就可以这样做。

于 2012-11-08T07:19:06.403 回答
0

一些事情:

1)我认为您正在通过根据对象的输入有选择地调用对象内的方法来创建模糊的体系结构。它引出了一个问题“为什么还要创建方法?为什么不直接使用大的 IF ELSE IF 类型结构?” 但其他人会不同意我的看法。

2) 这是 CoffeeScript 令人困惑的情况之一。如果包裹在显式大括号中,您正在处理通常会很清楚的事情。我不喜欢 javascript 到处疯狂使用匿名函数包装器,但我确实相信括号内的代码。我尊重第 1 点。我认为你这样做只是让事情变得更复杂。

3)你研究过coffeescript如何转换'this'关键字吗?我很确定 CoffeeScript 对“this”做了某种不同于标准 javascript 的智能转换,这意味着除了 Coffee 用户之外没有人可以为你回答这个问题。它不会与 javascript 相同。它是相关的,因为为了在不显式传递的情况下访问方法中的“面板”,您需要使用“this.panel”或其他一些取消引用机制从其中一种方法中访问面板成员。我不能告诉你怎么做,但我的这些信息可以帮助你朝着正确的方向前进。手头的问题显然是如何引用对象成员的问题。

于 2012-11-08T04:17:16.873 回答