Harmen的答案是相当不错的,但让我详细说明一下Coffeescript编译器在何处完成此 *** 作以及原因。
当您使用编译内容时
coffee -c foo.coffee,总会得到
foo.js如下所示的内容:
(function() { ...}).call(this);
这是为什么?好吧,假设您输入了
x = 'stringy string'
在中
foo.coffee。看到这种情况时,编译器会问:
x该范围或外部范围中是否已经存在?如果不是,它将
varx在Javascript输出中的该范围的顶部放置一个声明。
现在假设你写
x = 42
在中
bar.coffee,同时进行编译和连接
foo.js以
bar.js进行部署。你会得到
(function() { var x; x = 'stringy string'; ...}).call(this);(function() { var x; x = 42; ...}).call(this);
因此
xin
foo.coffee和
xin
bar.coffee完全相互隔离。这是Coffeescript的重要组成部分:
除非明确导出 (通过附加到共享的全局文件或
exportsNode.js中), 否则变量从一个.coffee文件不会泄漏到另一个文件 。
您可以通过使用
-b(“ bare”)标志来覆盖它
coffee,但这仅应在非常特殊的情况下使用。如果您在上面的示例中使用了它,则输出将是
var x;x = 'stringy string';...var x;x = 42;...
这可能会带来可怕的后果。为了测试这个自己,尝试添加
setTimeout (-> alert x),1在
foo.coffee。请注意,您不必自己连接两个JS文件-
如果您使用两个单独的
<script>标签将它们包含在页面中,它们仍然可以作为一个文件有效地运行。
通过隔离不同模块的作用域,Coffeescript编译器使您不必担心项目中的不同文件是否可能使用相同的局部变量名称。这是Javascript世界中的常见做法(例如,参见jQuery源或几乎所有jQuery插件),Coffeescript会为您处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)