web-dev-qa-db-ja.com

CoffeeScriptの匿名関数構文

私は CoffeeScript を見てきましたが、このようなコードをどのように書くかわかりません。構文でネストされた匿名関数をどのように処理しますか?

;(function($) {
          var app = $.sammy(function() {

            this.get('#/', function() {
              $('#main').text('');
            });

            this.get('#/test', function() {
              $('#main').text('Hello World');
            });

          });

          $(function() {
            app.run()
          });
        })(jQuery);
29
Handloomweaver

実際にはコンパイルしませんでしたが、これはうまくいくはずです

(($) ->
  app = $.sammy ->

    this.get '#/', ->
      $('#main').text '' 

    this.get '#/test', ->
      $('#main').text 'Hello World'

  $(->
    app.run()
  )
)(jQuery);
44
Matt Briggs

マットの答えは正しいですが、ここに代替方法があります:

CoffeeScript 1.0(この質問が提起されてから数週間後にリリースされました)では、直後に続く関数を実行するdo演算子が導入されました。それは主にループ内の変数をキャプチャするために使用されます。

for x in arr
  do (x) ->
    setTimeout (-> console.log x), 50

xへの参照を無名関数に渡す)の動作は

for x in arr
  setTimeout (-> console.log x), 50

後者はarrが1つしかないため、xの最後のエントリを繰り返し出力するだけです。

とにかく、引数の受け渡しに関する機能は現在少し制限されていますが、余分な括弧なしで無名関数を実行する方法としてdoに注意する必要があります。 それらを広げる提案 を提起しました。

現在、あなたのコード例と同等のものは

do ->
  $ = jQuery
  ...

私の提案が受け入れられれば、書くことが可能になります

do ($ = jQuery) ->
  ...

代わりに。

35
Trevor Burnham

ショートバリアント

do ($=jQuery)->
 app = $.sammy ->
   @get '#/', -> $("#main").text ''
   @get '#/test', -> $('#main').text 'Hello world'
 $ -> app.run()
4
lexich