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

2020/10/03 14:41 · javascript ·  · 0评论

在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中定义全局变量。“将它们作为窗口的属性附加”是什么意思?

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

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

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

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

Node.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?这个

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

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函数返回

咖啡脚本

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

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

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

就这样 :)

对我来说,@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

Ivo做到了这一点,但是我要提到,有一个肮脏的技巧可以使用,但是如果您要获取样式点,我不建议您这样做:您可以通过使用反引号将其转义,从而将JavaScript代码直接嵌入到CoffeeScript中。

但是,这就是为什么这通常是个坏主意的原因:CoffeeScript编译器没有意识到这些变量,这意味着它们将不遵守正常的CoffeeScript范围规则。所以,

`foo = 'bar'`
foo = 'something else'

编译为

foo = 'bar';
var foo = 'something else';

现在您foo在不同范围内拥有两个如常春藤所描述的那样,没有引用全局对象就无法从CoffeeScript代码修改全局的 方法foo

当然,如果您foo在CoffeeScript中进行分配,这只是一个问题-如果foo在赋予初始值(即全局常量)后变为只读,则嵌入式JavaScript解决方案可能有点可接受(尽管不建议)。

通过node.js下的coffee-script编译代码时,可以传递-b选项。编译后的代码将与coffeescript.org上的相同。

添加到Ivo Wetzel的答案中

似乎有一种简写语法exports ? this,我只能在Google网上论坛发帖中找到记录/提及的内容

即在网页中,要使某个函数在全局范围内可用,您可以再次使用@前缀声明该函数

<script type="text/coffeescript">
    @aglobalfunction = aglobalfunction = () ->
         alert "Hello!"
</script>

<a href="javascript:aglobalfunction()" >Click me!</a>

我认为您想要实现的目标可以像这样简单地完成:

在编译coffeescript时,请使用“ -b”参数。

-b/--bare 编译没有顶层函数安全包装器的JavaScript。

所以像这样: coffee -b --compile somefile.coffee whatever.js

就像在CoffeeScript.org网站中一样,这将输出您的代码。

如果您是坏人(我是坏人),则可以像下面这样简单: (->@)()

(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer

这个作品,因为调用时ReferenceFunction“裸”(即func(),而不是new func()obj.func()),一些通常被称为“函数调用调用模式”,总是结合this为使全局对象执行上下文

上面的CoffeeScript可以简单地编译为(function(){ return this })(); 因此,我们正在执行该行为以可靠地访问全局对象。

由于coffeescript很少单独使用,因此您可以使用globalnode.js或browserify提供的变量(以及任何后代,例如coffeeify,gulp构建脚本等)。

在node.js中global是全局名称空间。

在browserifyglobal中等于window

所以就:

somefunc = ->
  global.variable = 123
本文地址:http://javascript.askforanswer.com/ruhezaicoffeescriptzhongdingyiquanjubianliang.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!