在Coffeescript.org上:

bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10) 

将编译为:

var bawbag;
bawbag = function(x, y) {
  var z;
  return (z = (x * y));
};
bawbag(5, 10);

在node.js下通过coffee-script编译,这样包装:

(function() {
  var bawbag;
  bawbag = function(x, y) {
    var z;
    return (z = (x * y));
  };
  bawbag(5, 10);
}).call(this);

医生说:

如果您想创建顶级变量供其他脚本使用, 将它们作为属性附加到窗口上,或在导出对象上 CommonJS。存在操作符(下面将介绍)给出一个 如果你的目标是两者,这是一种可靠的方法,可以找出在哪里添加它们 CommonJS和浏览器:root = exports ?这

我如何定义全局变量然后在CoffeeScript。“将它们作为属性附加到窗口”是什么意思?


当前回答

对我来说,@atomicules似乎有最简单的答案,但我认为它可以再简化一点。你需要在任何你想要全局的东西前面加上@,这样它就会编译成这个。任何东西,this指向全局对象。

所以…

@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)

编译……

this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);

并在node.js提供的包装器内部和外部工作

(function() {
    this.bawbag = function(x, y) {
      var z;
      return z = x * y;
    };
    console.log(bawbag(5,13)) // works here
}).call(this);

console.log(bawbag(5,11)) // works here

其他回答

你可以在node.js下通过coffee-script编译代码时传递-b选项。 编译后的代码将与coffeescript.org上的代码相同。

我认为你想要达到的目标可以简单地这样做:

在编译coffeescript时,使用"-b"参数。

-b /——bare编译没有顶级函数安全包装的JavaScript。

像这样:coffee -b——compile somefile。咖啡whatever.js

这将输出您的代码,就像在CoffeeScript.org网站一样。

对我来说,@atomicules似乎有最简单的答案,但我认为它可以再简化一点。你需要在任何你想要全局的东西前面加上@,这样它就会编译成这个。任何东西,this指向全局对象。

所以…

@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)

编译……

this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);

并在node.js提供的包装器内部和外部工作

(function() {
    this.bawbag = function(x, y) {
      var z;
      return z = x * y;
    };
    console.log(bawbag(5,13)) // works here
}).call(this);

console.log(bawbag(5,11)) // works here

再补充一下伊沃·韦策尔的答案

似乎有一个导出的速记语法?这一点我只能在谷歌小组帖子中找到记录/提到。

例如,在一个网页中,要让一个函数全局可用,你再次声明一个@前缀的函数:

<script type="text/coffeescript">
    @aglobalfunction = aglobalfunction = () ->
         alert "Hello!"
</script>

<a href="javascript:aglobalfunction()" >Click me!</a>

Ivo很好地解决了这个问题,但我要提到一个你可以使用的小技巧,尽管如果你追求的是风格点,我不建议你这么做:你可以通过反勾转义直接将JavaScript代码嵌入到CoffeeScript中。

然而,这通常是一个坏主意:CoffeeScript编译器不知道这些变量,这意味着它们不会遵守正常的CoffeeScript作用域规则。所以,

`foo = 'bar'`
foo = 'something else'

编译,

foo = 'bar';
var foo = 'something else';

现在你有两个傻子在不同的范围内。正如Ivy所描述的,如果不引用全局对象,就无法从CoffeeScript代码中修改全局foo。

当然,这只是当你在coffeescript中赋值给foo时才会出现问题——如果foo在被赋予初始值后变成只读的(即它是一个全局常量),那么嵌入式JavaScript解决方案可能是可以接受的(尽管仍然不推荐)。