在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
Ivo很好地解决了这个问题,但我要提到一个你可以使用的小技巧,尽管如果你追求的是风格点,我不建议你这么做:你可以通过反勾转义直接将JavaScript代码嵌入到CoffeeScript中。
然而,这通常是一个坏主意:CoffeeScript编译器不知道这些变量,这意味着它们不会遵守正常的CoffeeScript作用域规则。所以,
`foo = 'bar'`
foo = 'something else'
编译,
foo = 'bar';
var foo = 'something else';
现在你有两个傻子在不同的范围内。正如Ivy所描述的,如果不引用全局对象,就无法从CoffeeScript代码中修改全局foo。
当然,这只是当你在coffeescript中赋值给foo时才会出现问题——如果foo在被赋予初始值后变成只读的(即它是一个全局常量),那么嵌入式JavaScript解决方案可能是可以接受的(尽管仍然不推荐)。