CoffeeScript中的匿名函数语法

Han*_*ver 29 javascript coffeescript

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

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

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

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

          });

          $(function() {
            app.run()
          });
        })(jQuery);
Run Code Online (Sandbox Code Playgroud)

Mat*_*ggs 44

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

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

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

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

  $(->
    app.run()
  )
)(jQuery);
Run Code Online (Sandbox Code Playgroud)

  • 由于coffeescript无论如何都会自动将代码包装在匿名函数中,你实际上只需将`$ = jQuery`放在文件的顶部,然后以jQuery作为参数取出匿名函数的调用. (11认同)
  • 是的,只是为他的代码的行端口做了一行 (2认同)

Tre*_*ham 35

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

在CoffeeScript 1.0(在提出这个问题几个星期后发布)中,do引入了一个运算符,它运行紧随其后的函数.它主要用于捕获循环中的变量,因为

for x in arr
  do (x) ->
    setTimeout (-> console.log x), 50
Run Code Online (Sandbox Code Playgroud)

(它将引用传递给x匿名函数)的行为与

for x in arr
  setTimeout (-> console.log x), 50
Run Code Online (Sandbox Code Playgroud)

后者将arr重复输出最后一个条目,因为只有一个x.

无论如何,你应该知道do一种在没有额外括号的情况下运行匿名函数的方法,尽管它在参数传递方面的能力目前有点受限.我提出了扩大它们建议.

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

do ->
  $ = jQuery
  ...
Run Code Online (Sandbox Code Playgroud)

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

do ($ = jQuery) ->
  ...
Run Code Online (Sandbox Code Playgroud)

代替.


小智 5

短款

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