Javascript 如何在CoffeeScript中定义全局变量?
在Coffeescript.org上: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
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