在 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);
文档说:
如果您想为其他脚本创建顶级变量以供使用,请将它们作为属性附加到 window 或 CommonJS 中的 exports 对象上。如果您同时针对 CommonJS 和浏览器,则存在运算符(下文介绍)为您提供了一种确定将它们添加到何处的可靠方法:root = exports ?这个
我如何在 CoffeeScript 中定义全局变量。 “将它们作为属性附加到窗口”是什么意思?
原文由 handloomweaver 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于 coffee 脚本没有
var
语句,它会自动为 coffee-script 中的所有变量插入它,这样可以防止编译的 JavaScript 版本将所有内容泄漏到 全局名称空间 中。因此,由于无法故意从咖啡脚本方面将某些内容“泄漏”到 全局命名空间 中,因此您需要将全局变量定义为 全局对象 的属性。
这意味着你需要做类似
window.foo = 'baz';
的事情,它处理浏览器的情况,因为那里的 全局对象 是window
。节点.js
在 Node.js 中没有
window
对象,取而代之的是exports
对象,它被传递到包装 Node.js 模块的包装器中(参见: https ://github.com/ ry/node/blob/master/src/node.js#L321 ),所以在 Node.js 中你需要做的是exports.foo = 'baz';
。现在让我们看看它在文档中引用的内容:
这显然是 coffee-script,所以让我们看看它实际编译成什么:
首先它会检查
exports
是否被定义,因为试图在 JavaScript 中引用一个不存在的变量否则会产生 SyntaxError(除非它与typeof
一起使用)因此,如果
exports
存在,这就是 Node.js 中的情况(或在写得不好的网站中……)根目录将指向exports
,否则指向this
。那么this
是什么?Using
.call
on a function will bind thethis
inside the function to the first parameter passed, in case of the browserthis
would now be thewindow
对象,在 Node.js 的情况下,它将是 全局上下文,它也可以用作global
对象。但是由于您在 Node.js 中具有
require
函数,因此无需将某些内容分配给global
Node.js 中的对象,而是分配给exports
然后由require
函数返回的对象。咖啡脚本
在所有这些解释之后,这是您需要做的:
这将在全局命名空间(无论是什么)中声明我们的函数
foo
。就这样 :)