Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在CoffeeScript中定义全局变量?_Javascript_Coffeescript - Fatal编程技术网

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

Javascript 如何在CoffeeScript中定义全局变量?,javascript,coffeescript,Javascript,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脚本进行编译,可以这样包装: (function() { var bawbag; bawbag = function

在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脚本进行编译,可以这样包装:

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

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


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

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

因此,由于无法故意从事物的咖啡脚本端将某些东西“泄漏”到全局命名空间中,因此需要将全局变量定义为全局对象的属性

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

这意味着您需要执行类似于
window.foo='baz'的操作,它处理浏览器的大小写,因为那里的全局对象是
窗口

Node.js 在Node.js中没有
窗口
对象,而是有
导出
对象被传递到包装Node.js模块的包装器中(请参见:),因此在Node.js中,您需要做的是
导出.foo='baz'

现在,让我们看一下您从文档中引用的内容:

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

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

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
首先,它将检查是否定义了
exports
,因为尝试引用JavaScript中不存在的变量会产生语法错误(与
typeof
一起使用时除外)

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

(function() {...}).call(this);
对函数使用
.call
会将函数中的
this
绑定到传递的第一个参数,在浏览器中
this
现在是
窗口
对象,在Node.js中是全局上下文,也可以作为
全局
对象使用

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

咖啡剧本 在所有这些解释之后,下面是您需要做的:

root = exports ? this
root.foo = -> 'Hello World'
这将在全局名称空间中声明我们的函数
foo


仅此而已:)

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

因此,由于无法故意从事物的咖啡脚本端将某些东西“泄漏”到全局命名空间中,因此需要将全局变量定义为全局对象的属性

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

这意味着您需要执行类似于
window.foo='baz'的操作,它处理浏览器的大小写,因为那里的全局对象是
窗口

Node.js 在Node.js中没有
窗口
对象,而是有
导出
对象被传递到包装Node.js模块的包装器中(请参见:),因此在Node.js中,您需要做的是
导出.foo='baz'

现在,让我们看一下您从文档中引用的内容:

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

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

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
首先,它将检查是否定义了
exports
,因为尝试引用JavaScript中不存在的变量会产生语法错误(与
typeof
一起使用时除外)

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

(function() {...}).call(this);
对函数使用
.call
会将函数中的
this
绑定到传递的第一个参数,在浏览器中
this
现在是
窗口
对象,在Node.js中是全局上下文,也可以作为
全局
对象使用

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

咖啡剧本 在所有这些解释之后,下面是您需要做的:

root = exports ? this
root.foo = -> 'Hello World'
这将在全局名称空间中声明我们的函数
foo


仅此而已:)

Ivo解决了这个问题,但我要提到的是,有一个肮脏的技巧你可以使用,不过如果你想获得风格点,我不建议你使用它:你可以通过反勾号将JavaScript代码直接嵌入到你的咖啡脚本中

然而,这就是为什么这通常是一个坏主意:CoffeeScript编译器不知道这些变量,这意味着它们不会遵守正常规则
@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)
this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);
(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
(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer
somefunc = ->
  global.variable = 123