一尘不染

如何在CoffeeScript中定义全局变量?

javascript

在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中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root
= exports?这个

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


阅读 394

收藏
2020-04-25

共1个答案

一尘不染

由于coffee脚本没有var语句,因此它会自动将其插入coffee脚本中的所有变量,这样可以防止已编译的JavaScript版本将所有内容泄漏到
全局命名空间中

因此,由于没有办法故意从咖啡脚本方面使某些内容“泄漏”到 全局名称空间中 ,因此您需要将全局变量定义为 全局对象的 属性。

将它们作为属性附加在窗口上

这意味着您需要执行类似之类的操作window.foo = 'baz';来处理浏览器的情况,因为那里的 全局对象window

Node.js

在Node.js中没有window对象,而是有一个exports对象传递给包装Node.js模块的包装器,因此在Node.js中,您需要做的是exports.foo= 'baz';

现在,让我们看看它在您的文档中的报价中指出的内容:

…针对CommonJS和浏览器:root = exports?这个

显然,这是咖啡脚本,因此让我们看一下它实际编译成的内容:

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;

首先,它将检查是否exports已定义,因为尝试在JavaScript中引用不存在的变量会否则产生SyntaxError(与结合使用时除外typeof

因此,如果exports存在(在Node.js(或写得不好的WebSite
…)中),则根目录将指向exports,否则指向this。那是this什么

(function() {...}).call(this);

使用.call上的功能将绑定this功能里面第一个参数传递,在浏览器的情况下,this现在会是window对象,在Node.js的的情况下,这将是
全球范围内 它也可作为global对象。

但是,由于您require在Node.js中具有该函数,因此无需global在Node.js中为该对象分配某些内容,而是您可以分配给该exports对象,然后该对象将由require函数返回。

Coffee-Script

经过所有这些解释之后,您需要执行以下操作:

root = exports ? this
root.foo = -> 'Hello World'

这将foo在全局名称空间中声明我们的函数(无论发生什么情况)。
就这样 :)

2020-04-25