CoffeeScript中匿名函数的语法

31

我一直在研究CoffeeScript,但是我不明白如何编写像这样的代码。它如何处理嵌套的匿名函数语法?

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

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

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

          });

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

4
CoffeeScript网站有一个“试用CoffeeScript”功能,可以即时编译成JavaScript。我花了几分钟的时间试玩后就能得到答案。 - Joey Adams
3个回答

44

我没有实际编译它,但这应该可以工作

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

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

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

  $(->
    app.run()
  )
)(jQuery);

11
由于CoffeeScript会自动将代码包装在匿名函数中,因此您实际上可以只在文件顶部放置$ = jQuery,并删除以jQuery作为参数调用匿名函数的操作。 - Derek Dahmer

36

Matt的回答是正确的,但这里有一种替代方法:

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中的最后一个条目,因为只有一个x
无论如何,你应该知道do可以作为一种运行匿名函数的方式,而不需要额外的括号,尽管它在参数传递方面的能力目前有些受限。我已经提出了一份提案以扩展这些能力
目前,你的代码示例的等价物将是:
do ->
  $ = jQuery
  ...
如果我的提案被接受,将有可能编写
do ($ = jQuery) ->
  ...

转而使用此方法。


这种方法非常好,因为考虑到CoffeeScript的哲学,它不需要任何闭合括号。 - user133408

5

简短版本

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接