Coffeescript —如何创建自启动匿名函数?


Answers:


160

虽然您可以只使用括号(例如(-> 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在循环后打印3次值。


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 2011年

2
从CoffeeScript 1.3.1(2012年4月发布)开始,do还允许您将参数传递给函数。传递12作为参数xy,编写do (x = 1, y = 2) ->。(此功能的文档已经丢失,但是引入该功能的问题有一些示例。)
Rory O'Kane 2013年

19

如果您想“别名”传递给CoffeeScript中自调用函数的参数,可以说这是您要实现的目标:

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

那就do (window, document) ->别让你那样做。接下来的方法是使用括号:

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

5
do (global=window, doc=document) ->
比利·穆恩


5

您也可以将do关键字与默认函数参数结合使用,以初始值播种递归“自启动函数”。例:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

这将创建一个自执行的闭包,这对于范围界定很有用。


1
与已经发布的其他答案相比,这似乎并没有添加很多新信息。除了创建竞争性答案外,您还可以通过在另一个答案下发布翔实的注释来增加更多价值,该注释可以为另一个答案添加一些清晰度或有用的信息。
still_dreaming_1 2015年

1

抱歉,我解决了这个问题:

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

1
@Squeegy我不一定要这么说。该do关键词有一定的局限性,使有必要有时使用JS样式的方法(参见问题960); do真正的添加只是因为闭环的用例。
特雷弗·伯纳姆

1
但是我们也不是用CoffeeScript那样打脸。
布兰登

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.