如何在CoffeeScript中编写这个lambda闭包?

时间:2011-08-24 04:29:36

标签: javascript coffeescript

我正在尝试使用CoffeeScript重新创建这个流行的jQuery lambda闭包:

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

到目前为止,我有这个:

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

我收到了这个错误:

  

错误:第1行的解析错误:意外的'BOOL'

看起来undefined是问题的原因。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:54)

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来生成未定义的值。

答案 1 :(得分:13)

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

编译到

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