Coffeescript --- 如何创建一个自启动的匿名函数?

87

如何使用coffeescript编写这段代码?

f = (function(){
   // something
})();

谢谢任何建议 :)

8个回答

159

尽管你可以直接使用括号(例如(-> foo)()),但你可以通过使用do关键字来避免它们:

do f = -> console.log 'this runs right away'

do 最常见的用法是在循环中捕获变量。例如:

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

如果没有 do 循环结构,你将只会在循环执行完之后打印三次变量 x 的值。


24
你可以写成 f = do -> console.log x - scribu
5
@scribu,这两个陈述非常不同,你的陈述实际上是我应该给出的陈述。我的将函数 -> console.log 'this runs right away' 分配给 f,然后运行它;而你的则运行函数,然后将其结果分配给 f,就像原始问题中一样。(尽管在使用 console.log 时,返回值总是undefined。) - Trevor Burnham
1
没错。此外,你可以这样定义对象属性:{f: do -> // something} - scribu
2
自 CoffeeScript 1.3.1(发布于2012年4月)起,do 还允许您将参数传递给函数。要将 12 作为参数 xy 传递,请编写 do (x = 1, y = 2) ->。(此功能的文档已经丢失,但是引入该功能的问题中有一些示例。) - Rory O'Kane

19

如果你想在 CoffeeScript 的自执行函数中给参数起别名,假设这就是你想要实现的:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

那么do (window, document) ->就无法让你这样做。正确的方式是使用括号:

翻译后的内容为:

那么do (window, document) ->就无法让你这样做。正确的方式是使用括号:

(( global, doc ) -> 
  # your code here
)( window, document ) 

6
do (global = window, doc = document) -> 表示定义了一个函数,其中globaldoc是该函数的两个参数,它们分别被赋值为 windowdocument对象。 - Billy Moon

17

在咖啡中,这太容易了:

do ->

将返回

(function() {})();

6

尝试使用

do ($ = jQuery) ->

5
您可以将 do 关键字与默认函数参数结合使用,为递归的“自启动函数”提供初始值。例如:
do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000

3
do ->
    #your stuff here

这将创建一个自执行闭包,这对于作用域很有用。

1
与已发布的其他答案相比,这似乎并没有增加太多新信息。与其创建一个竞争性的答案,不如在其他答案下发布一条信息丰富或有用的评论,以增加一些清晰度或有用的信息。 - still_dreaming_1

1

抱歉,我已经解决了:

f = (
    () -> "something"
)()

1
@Squeegy,我不一定会这么说。 do 关键字有一些限制,有时需要使用 JS 风格的方法(请参见 issue 960);实际上只是因为循环闭包用例才添加了 do - Trevor Burnham
1
但我们也不会像那样使用CoffeeScript来打自己的脸。 - Brandon

0

应该是这样的

f = () ->
  # do something

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