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

Tha*_*you 22 javascript coffeescript

我试图用CoffeeScript重新创建这个流行的jQuery lambda闭包:

(function($, window, undefined){
  $(document).ready(function(){
    ...
  });
})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)

到目前为止我有这个:

(($, window, undefined) ->
  $ ->
    alert "js!"
)(jQuery, window)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

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

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

小智 54

undefined是CoffeeScript中的关键字.您无需确保正确定义,因此您可以忘记该部分.

CoffeeScript提供了一个do关键字,您可以使用该关键字创建闭包,而不是使用立即调用的函数表达式语法.

CoffeeScript Source 试一试
do ($ = jQuery, window) ->  
  $ ->  
    alert "js!"
Run Code Online (Sandbox Code Playgroud) 编译的JavaScript
(function($, window) {
  return $(function() {
    return console.log("js!");
  });
})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)

在CoffeeScript 1.3.1之前,不支持上述语法.对于旧版本,您仍需要执行此操作:

CoffeeScript来源[试试]
(($, window) ->
  $ ->
    alert "js!"
)(jQuery, window)
Run Code Online (Sandbox Code Playgroud)

如果你很好奇,这就是CoffeeScript的处理方式undefined.

CoffeeScript来源[试试]
console.log undefined
Run Code Online (Sandbox Code Playgroud) 编译的JavaScript
console.log(void 0);
Run Code Online (Sandbox Code Playgroud)

您可以看到它不使用undefined变量,而是使用JavaScript的void运算符来生成未定义的值.


aus*_*nbv 13

do ($, window) ->
  $ ->
    alert "js!"
Run Code Online (Sandbox Code Playgroud)

编译成

(function($, window) {
  return $(function() {
    return alert("js!");
  });
})($, window);
Run Code Online (Sandbox Code Playgroud)