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

如何把这些写在咖啡纸上?

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

谢谢你的建议:)

20121 次浏览

Apologies, I solved it:

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

While you can just use parentheses (e.g. (-> foo)(), you can avoid them by using the do keyword:

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

The most common use of do is capturing variables in a loop. For instance,

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

Without the do, you'd just be printing the value of x after the loop 3 times.

If you want to "alias" the arguments passed to self-invoking function in CoffeeScript, and let's say this is what you are trying to achieve:

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

Then do (window, document) -> won't let you do that. The way to go is with parens then:

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

try to use

do ($ = jQuery) ->

You can also combine the do keyword with default function parameters to seed recursive "self-initiating functions" with an initial value. Example:

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

it's ridiculous easy in coffee:

do ->

will return

(function() {})();
do ->
#your stuff here

This will create a self executing closure, which is useful for scoping.

It should be

f = () ->
# do something