2

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

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

第一次尝试:

do (root) ->
    'Hello Coffee'

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

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

2 回答 2

6

没有理由相信你可以完全得到那个 JavaScript,也可能没有理由完全得到那个 JavaScript。你可以得到一些功能上等价的东西:

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

变成这个 JavaScript:

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

它和你的 JavaScript 做同样的事情。


do关键字用于循环内部:

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

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

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

你想打破循环变量和它在闭包中的使用之间的联系。这就是为什么root在 JavaScript 版本中出现两次的原因

do (root) ->
    'Hello Coffee'
于 2013-02-17T03:28:52.127 回答
5

你可以这样做

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

这段代码将被编译成

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

请参阅CoffeeScript.org 控制台示例

于 2013-03-24T11:07:25.370 回答