2011-04-09 52 views

回答

1

道歉,我解決了這個問題:

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

http://jashkenas.github.com/coffee-script/那裏面有一個閉合例子。 – kjy112 2011-04-09 13:33:12

+8

這不是咖啡劇本的方式。即使它有效。 – 2011-04-10 18:27:47

+1

@Squeegy我不一定會這麼說。 'do'關鍵字有一些限制,有時需要使用JS風格的方法(參見[issue 960](https://github.com/jashkenas/coffee-script/issues/960)); 'do'只是因爲封閉循環用例而被添加的。 – 2011-08-08 13:42:20

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倍。

+1

+1哇,我不知道可以這樣用。真棒! – 2011-04-11 05:25:02

+24

你也可以寫'f = do - > console.log x' – scribu 2011-08-07 16:26:49

+5

@scribu那麼,這兩個語句是非常不同的,而你的實際上是我應該給出的。我分配功能' - >控制檯。記錄'這個馬上跑'到'f',然後運行它;你的運行函數然後把它的結果賦給'f',就像原來的問題一樣。 (儘管在'console.log'的情況下,反正總是返回undefined。) – 2011-08-07 19:23:23

19

如果你想「別名」參數傳遞給CoffeeScript的自我調用函數,讓我們說這是你想達到什麼目的:

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

然後do (window, document) ->不會讓你這樣做。要走的路是用括號則:

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

'do(global = window,doc = document) - >' – 2015-08-20 19:21:16

5

嘗試使用

do ($ = jQuery) -> 
5

您還可以使用默認參數,結合do關鍵字種子遞歸「自啓動功能」的初始值。例如:

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

這很可笑容易在咖啡:

do -> 

將返回

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

這將創建一個自閉執行,這是非常有用的作用域。

+1

這似乎並沒有增加大量的新信息,相比之下其他答案已經發布。與其創建一個相互競爭的答案,您可以通過在另一個答案中發佈內容豐富的評論來增加更多價值,該答案爲其他答案增加了一些清晰或有用的信息。 – 2015-02-05 22:37:38

0

應該

f =() -> 
    # do something