【问题标题】:How can I write this lambda closure in CoffeeScript?如何在 CoffeeScript 中编写这个 lambda 闭包?
【发布时间】:2011-11-02 11:34:42
【问题描述】:

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

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

到目前为止,我有这个:

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

我收到此错误:

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

看起来undefined 是这里问题的原因。我该如何解决这个问题?

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      do ($, window) ->
        $ ->
          alert "js!"
      

      编译成

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

      【讨论】:

      • 我希望在我的 func 签名中获得 undefined arg。我知道这并不重要,但为什么coffeescript 不让我这样做呢?
      • 因为正如另一个答案所说,coffeescript 将单词 undefined 编译为 void 0 并且不依赖于该变量
      • @naomi 这是一个关键字。在函数签名中包含undefined 的目的是什么? CoffeeScript 应该消除对它的需要。
      • @Jeremy Blanks,它保证undefined 将表现为未定义的javascript。正如我所说,我想这没有必要,但感谢你的回答,现在我知道为什么了:)
      • @naomi 这就是coffeescript 通过将 undefined 设为保留字来解决的问题。这样你就不必这样做了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2012-05-29
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多