定义一个函数并立即在Coffee中调用它,无法获得所需的结果

时间:2013-02-17 03:12:05

标签: coffeescript

无法让我的Coffee脚本将完全编译为

( function (root) { return 'Hello Coffee'; }(this) );

首次尝试:

do (root) ->
    'Hello Coffee'

...没有生成与上面相同的代码,输出(使用--bare):

(function(root) {
  return 'Hello Coffee';
})(root);

2 个答案:

答案 0 :(得分:6)

没有理由相信你可以完全获得JavaScript,并且可能没有理由得到完全相同的JavaScript。你可以获得功能相同的东西:

((root) -> 'Hello Coffee')(@)

成为这个JavaScript:

(function(root) { return 'Hello Coffee'; })(this);

与JavaScript的功能相同。


do keyword适用于循环内部:

  

当使用JavaScript循环生成函数时,通常会插入一个闭包装,以确保循环变量被关闭,并且所有生成的函数不只是共享最终值。 CoffeeScript提供do关键字,它立即调用传递的函数,转发任何参数。

你通常会在这样的事情中使用do

for x in a
    do (x) ->
        $("##{x}").click -> console.log x

你想要打破一个循环变量与它在闭包中的使用之间的联系。这就是root在JavaScript版本

中出现两次的原因
do (root) ->
    'Hello Coffee'

答案 1 :(得分:5)

你可以这样做

do (root = @) ->
  'Hello Coffee'

此代码将编译为

(function(root) {
  return 'Hello Coffee';
})(this);

请参阅CoffeeScript.org console example