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

use*_*339 86 javascript javascript-framework coffeescript

如何在coffeescript中写这个?

f = (function(){
   // something
})();
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何提示:)

Tre*_*ham 160

虽然您可以使用括号(例如(-> foo)(),您可以通过使用do关键字来避免它们:

do f = -> console.log 'this runs right away'
Run Code Online (Sandbox Code Playgroud)

最常见的用途do是在循环中捕获变量.例如,

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1
Run Code Online (Sandbox Code Playgroud)

没有do,你只需要x在循环后打印3次的值.

  • 你也可以写`f = do - > console.log x` (24认同)
  • @scribu嗯,这两个陈述是非常不同的,你的实际上是我应该给出的.我将函数` - > console.log'分配给'f`,然后运行它; 你的运行该函数然后将其结果分配给`f`,就像在原始问题中一样.(虽然在`console.log`的情况下,返回值始终是`undefined`.) (5认同)
  • 从CoffeeScript 1.3.1(2012年4月发布)开始,`do`还允许您将参数传递给函数.要传递`1`和`2`作为参数`x`和`y`,写'do(x = 1,y = 2) - >`.(此功能的文档已经[丢失](https://github.com/jashkenas/coffee-script/pull/2660#issuecomment-14369711),但[引入该功能的问题](https:// github.com/jashkenas/coffee-script/issues/960)有一些例子.) (2认同)

Mis*_*lin 19

如果你想在CoffeeScript中"传递"传递给自调用函数的参数,让我们说这就是你想要实现的:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );
Run Code Online (Sandbox Code Playgroud)

然后do (window, document) ->不会让你这样做.接下来的方法是使用parens:

(( global, doc ) -> 
  # your code here
)( window, document ) 
Run Code Online (Sandbox Code Playgroud)

  • `do(global = window,doc = document) - >` (5认同)

mar*_*ini 16

这在咖啡中很容易:

do ->
Run Code Online (Sandbox Code Playgroud)

将返回

(function() {})();
Run Code Online (Sandbox Code Playgroud)


Xåp*_* - 5

您还可以将do关键字与默认函数参数组合,以使用初始值为递归"自启动函数"设定种子.例:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000
Run Code Online (Sandbox Code Playgroud)


use*_*339 1

抱歉,我解决了:

f = (
    () -> "something"
)()
Run Code Online (Sandbox Code Playgroud)