2011-08-24 29 views
21

我試圖重新創建的CoffeeScript這個流行的jQuery拉姆達關閉:如何在CoffeeScript中編寫這個lambda閉包?

(function($, window, undefined){ 
    $(document).ready(function(){ 
    ... 
    }); 
})(jQuery, window); 

到目前爲止,我有這樣的:

(($, window, undefined) -> 
    $ -> 
    alert "js!" 
)(jQuery, window) 

我得到這個錯誤:

Error: Parse error on line 1: Unexpected 'BOOL'

它看起來像undefined這裏是問題的原因。任何想法如何解決這個問題?

回答

53

undefined是在CoffeeScript的關鍵字。你不需要確保它被正確定義,所以你可以忘記那部分。

CoffeeScript提供了一個do關鍵字,您可以使用該關鍵字創建閉包,而不是使用立即調用的函數表達式語法。

CoffeeScript的來源 try it
do ($ = jQuery, window) -> 
    $ -> 
    alert "js!" 
編譯的JavaScript
(function($, window) { 
    return $(function() { 
    return console.log("js!"); 
    }); 
})(jQuery, window); 

上述語法不被支持,直到CoffeeScript的1.3.1。對於較舊的版本,你仍然需要做:

CoffeeScript的來源 [try it]
(($, window) -> 
    $ -> 
    alert "js!" 
)(jQuery, window) 

如果你很好奇,這裏的CoffeeScript如何處理undefined

CoffeeScript的來源 [try it]
console.log undefined 
編譯的JavaScript
console.log(void 0); 

你可以看到,它不使用undefined變量,而是使用JavaScript's void operator產生未定義的值。

13
do ($, window) -> 
    $ -> 
    alert "js!" 

編譯爲

(function($, window) { 
    return $(function() { 
    return alert("js!"); 
    }); 
})($, window); 
+0

我正在尋找'我的func簽名中的'undefined' arg。我知道這並不重要,但爲什麼不讓咖啡做到這一點? – naomik

+1

,因爲作爲另一個答案說coffeescript將單詞'undefined'編譯爲'void 0'並且不依賴於該變量 – austinbv

+0

@naomi這是一個關鍵字。在函數簽名中有'undefined'的目的是什麼? CoffeeScript應該消除它的需要。 –

相關問題