【问题标题】:Anonymous functions syntax in CoffeeScriptCoffeeScript 中的匿名函数语法
【发布时间】:2011-05-09 03:54:37
【问题描述】:

我一直在查看CoffeeScript,但我不明白您将如何编写这样的代码。它如何处理语法中的嵌套匿名函数?

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

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

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

          });

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

【问题讨论】:

  • CoffeeScript website 有一个 Try CoffeeScript 功能,可以即时编译成 JavaScript。我能够在几分钟内找到答案。

标签: javascript coffeescript


【解决方案1】:

短变体

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

【讨论】:

    【解决方案2】:

    马特的回答是正确的,但这里有另一种方法:

    在 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 是一种无需额外括号即可运行匿名函数的方式,尽管目前它在参数传递方面的功能有点受限。我提出了proposal to broaden them

    目前,相当于您的代码示例

    do ->
      $ = jQuery
      ...
    

    如果我的提议被接受,就可以写了

    do ($ = jQuery) ->
      ...
    

    改为。

    【讨论】:

    • 这个方法真的很不错,考虑到coffeescript philosofy它不需要任何右括号
    【解决方案3】:

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

    (($) ->
      app = $.sammy ->
    
        this.get '#/', ->
          $('#main').text '' 
    
        this.get '#/test', ->
          $('#main').text 'Hello World'
    
      $(->
        app.run()
      )
    )(jQuery);
    

    【讨论】:

    • 由于coffeescript无论如何都会自动将代码包装在匿名函数中,因此您实际上可以将$ = jQuery放在文件顶部,然后以jQuery作为参数调用匿名函数。跨度>
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2012-04-15
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多