由于咖啡脚本没有var声明,它会自动为咖啡脚本中的所有变量插入它,这样它就可以防止编译的 JavaScript 版本将所有内容泄漏到全局命名空间中。
因此,由于无法故意从咖啡脚本方面将某些内容“泄漏”到全局命名空间中,因此您需要将全局变量定义为global object 的属性。
将它们作为属性附加到窗口上
这意味着您需要执行类似window.foo = 'baz';, 处理浏览器情况的操作,因为全局对象是window.
节点.js
在 Node.js 中没有window对象,而是exports传递到包装 Node.js module的包装器中的对象(参见:https : //github.com/ry/node/blob/master/src/node.js# L321 ),所以在 Node.js 中你需要做的是exports.foo = 'baz';.
现在让我们来看看它在您的文档引用中的说明:
...同时针对 CommonJS 和浏览器: root = 导出?这
这显然是咖啡脚本,所以让我们看看它实际编译成什么:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
首先它会检查是否exports已定义,因为在 JavaScript 中尝试引用一个不存在的变量会产生一个 SyntaxError(除非它与 一起使用typeof)
因此,如果exports存在,在 Node.js 中(或在写得不好的网站...)中就是这种情况,root 将指向exports,否则指向this。那是什么this?
(function() {...}).call(this);
使用.call上的功能将绑定this功能里面第一个参数传递,在浏览器的情况下,this现在会是window对象,在Node.js的的情况下,这将是全球范围内它也可作为global对象。
但是由于您require在 Node.js 中拥有该函数,因此无需为globalNode.js 中的对象分配任何内容,而是分配给该exports对象然后由该require函数返回。
咖啡脚本
在进行了所有这些解释之后,您需要执行以下操作:
root = exports ? this
root.foo = -> 'Hello World'
这将foo在全局命名空间中声明我们的函数(无论发生什么)。
就这样 :)