在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 下的coffee脚本编译.js这样包装:

(function() {
  var bawbag;
  bawbag = function(x, y) {
    var z;
    return (z = (x * y));
  };
  bawbag(5, 10);
}).call(this);

doctor 说:

如果您想创建顶级变量以供其他脚本使用, 将它们作为属性附加到Window上,或附加到中的导出对象上 CommonJS.存在运算符(如下所述)为您提供了一个 确定将它们添加到何处的可靠方法,如果您同时针对这两个目标 CommonJS和浏览器:root=exports?这

那么如何在CoffeeScript中定义全局变量呢."将它们作为属性附加到窗口"是什么意思?

推荐答案

由于coffee脚本没有var语句,它会自动为coffee脚本中的所有变量插入var语句,这样可以防止编译后的JavaScript版本将所有内容泄漏到global namespace中.

因此,由于没有办法让某些东西故意从咖啡脚本一侧"泄漏"到global namespace中,所以需要将全局变量定义为global object的属性.

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

这意味着您需要执行类似于window.foo = 'baz';的操作,这将处理浏览器的情况,因为global objectwindow.

node .js

在 node 中.js没有window对象,而是exports对象被传递到包装 node 的包装器中.js模块(见:https://github.com/ry/node/blob/master/src/node.js#L321),所以在 node 中.你需要做的是exports.foo = 'baz';.

现在让我们来看看你在文件中的报价:

...同时针对CommonJS和浏览器:root=exports?这

这显然是咖啡脚本,让我们来看看这实际上编译为:

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

首先,它将判断是否定义了exports,因为try 在JavaScript中引用一个不存在的变量会产生语法错误(与typeof一起使用时除外)

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

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

在函数上使用.call会将函数中的this绑定到传递的第一个参数,如果是浏览器,this现在将是window对象,如果是 node .它将是global context,也可以作为global对象使用.

但既然 node 中有require函数.js,无需为 node 中的global对象分配某些内容.js,而是将其分配给exports对象,然后由require函数返回.

咖啡 playbook

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

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

这将在全局名称空间中声明我们的函数foo(不管发生什么)

Javascript相关问答推荐

如何获取转换字节的所有8位?

如何使用Echart 5.5.0创建箱形图

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

jQuery s data()[storage object]在vanilla JavaScript中?'

将本机导航路由react 到导航栏中未列出的屏幕?

更改JSON中使用AJAX返回的图像的路径

setcallback是什么时候放到macrotask队列上的?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如何使用基于promise (非事件emits 器)的方法来传输数据?

当标题被点击时,如何使内容出现在另一个div上?

在D3条形图中对具有相同X值的多条记录进行分组

背景动画让网站摇摇欲坠

Node.js API-queryAll()中的MarkLogic数据移动

使用Reaction窗体挂钩注册日历组件

如何在尚未创建的鼠标悬停事件上访问和着色div?

ReferenceError:无法在初始化之前访问setData

在没有任何悬停或其他触发的情况下连续交换图像

使用VITE开发服务器处理错误

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起

JavaScript structuredClone在Chrome/Edge中获得了非法调用,但在NodeJS中没有