2

レイアウトの一部を coffeescript で管理したい。左/右のパネルがあり、それらを切り替えられるようにしたいです。私はこのようなものを作成しました:

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するだけでアクセスできます。panelswitchPanel

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

そうすればfuncs[action]()、彼らは好きなことをすることができますpanel

デモ: http://jsfiddle.net/ambiguous/UV42x/

JavaScript のクロージャーについて読むと、2 番目のバージョンで何が起こっているのかが明確になります。

悪い. if(action !of funcs)_ actionまたは、コメントでAaron Dufourfuncs[action]?()が指摘しているように、有効であることを 1 回だけ確認する必要がある場合は可能actionです。

于 2012-11-08T07:19:06.403 に答える
0

いくつかのこと:

1)オブジェクトへの入力に基づいてオブジェクト内のメソッドを選択的に呼び出すことにより、難読化されたアーキテクチャを作成していると思います。「なぜメソッドを作成するのですか?なぜ大きな IF ELSE IF 型構造を使用しないのですか?」という疑問が生じます。しかし、他の人は私に反対するでしょう。

2) これは、CoffeeScript の紛らわしい状況の 1 つです。明示的な中括弧で囲まれた場合、通常は明確になる何かを扱っています。私はどこでも無名関数ラッパーを使用する JavaScript のクレイジーな使用は好きではありませんが、括弧付きのコードは信じています。ポイント1に任せます。このようにすることで、物事をより複雑にしているだけだと思います。

3) coffeescript が「this」キーワードをどのように変換するかを調べましたか? 私は、CoffeeScript が標準の JavaScript から逸脱した「this」に対してある種のスマートな変換を行っていると確信しています。これは、Coffee ユーザー以外の誰もこの質問に答えることができないことを意味します。JavaScript と同じにはなりません。明示的に渡さずにメソッドの「パネル」にアクセスするには、「this.panel」またはその他の逆参照メカニズムを使用して、メソッドの 1 つからパネル メンバーにアクセスする必要があるため、これは適切です。方法はわかりませんが、この情報はあなたを正しい方向に導くのに役立ちます. 当面の問題は、明らかに、オブジェクト メンバーを参照する方法の問題です。

于 2012-11-08T04:17:16.873 に答える