如何用coffeescript写这个?
f = (function(){
// something
})();
谢谢你的提示:)
Answers:
虽然您可以只使用括号(例如(-> 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次值。
-> console.log 'this runs right away'
给f
,然后运行它;您将运行该函数,然后将其结果分配给f
,就像原始问题一样。(尽管在情况下console.log
,返回值始终是undefined
反正。)
{f: do -> // something}
do
还允许您将参数传递给函数。传递1
和2
作为参数x
和y
,编写do (x = 1, y = 2) ->
。(此功能的文档已经丢失,但是引入该功能的问题有一些示例。)
如果您想“别名”传递给CoffeeScript中自调用函数的参数,可以说这是您要实现的目标:
(function ( global, doc ) {
// your code in local scope goes here
})( window, document );
那就do (window, document) ->
别让你那样做。接下来的方法是使用括号:
(( global, doc ) ->
# your code here
)( window, document )
do (global=window, doc=document) ->
您也可以将do
关键字与默认函数参数结合使用,以初始值播种递归“自启动函数”。例:
do recursivelyPrint = (a=0) ->
console.log a
setTimeout (-> recursivelyPrint a + 1), 1000
尝试使用
do ($ = jQuery) ->
do ->
#your stuff here
这将创建一个自执行的闭包,这对于范围界定很有用。
它应该是
f = () ->
# do something
f = do -> console.log x