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

新手上路,请多包涵

在 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 许可协议

阅读 552
2 个回答

由于 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';

现在让我们看看它在文档中引用的内容:

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

这显然是 coffee-script,所以让我们看看它实际编译成什么:

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

首先它会检查 exports 是否被定义,因为试图在 JavaScript 中引用一个不存在的变量否则会产生 SyntaxError(除非它与 typeof 一起使用)

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

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

Using .call on a function will bind the this inside the function to the first parameter passed, in case of the browser this would now be the window 对象,在 Node.js 的情况下,它将是 全局上下文,它也可以用作 global 对象。

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

咖啡脚本

在所有这些解释之后,这是您需要做的:

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

这将在全局命名空间(无论是什么)中声明我们的函数 foo

就这样 :)

原文由 Ivo Wetzel 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,@atomicules 似乎有最简单的答案,但我认为它可以再简化一点。你需要在你想要全局的任何东西之前放置一个 @ ,以便它编译为 this.anythingthis 指的是全局对象。

所以…

 @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

原文由 Billy Moon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题