因此,对于咖啡脚本而言,我必须相当快地学习新工作。以下代码之间的区别是什么:
class Person
与
class @Person
如果我使用以下
bob = new Person()
结果会有何不同?
答案 0 :(得分:0)
@
适用于this
,因此class @Person
已编译为this.Person =
...
您可以在js2coffee
查看已编译的JS的内容答案 1 :(得分:0)
如果您查看class C
和class @C
生成的完整JavaScript,事情应该更清晰。 class C
成为(通过一些清理):
(function() {
var C = (function() {
function C() {}
return C;
})();
}).call(this);
因此C
“class”实际上是自调用函数(SIF)包装器中的局部变量。这个包装器是CoffeeScript处理scoping:
虽然为了清楚起见在本文档中进行了限制,但所有CoffeeScript输出都包含在一个匿名函数中:
(function(){ ... })();
此安全包装器与自动生成var
关键字相结合,使得污染非常困难意外的全局命名空间。
如果我们查看class @C
,我们会看到几乎相同的事情:
(function() {
this.C = (function() {
function C() {}
return C;
})();
}).call(this);
区别在于var C
(局部变量)与this.C
(this
上的属性)。
那么SIF内的this
是什么?内部的this
将是它外面的任何东西:
(function() { ... }).call(this)
// -----------------------^^^^
因为call
用于调用SIF。 this
在SIF之外的内容是什么?在浏览器中,它为window
,因此class @C
等同于class window.C
,window
的属性全局可见;因此,class @C
会使C
在浏览器环境中全局可见,而简单的class C
只会在定义它的文件中可见。
更常见的方法(至少在我使用过的代码中)是拥有一个全局可见的特定于应用程序的命名空间:
// Somewhere before anything else happens...
window.whatever_the_app_is_called = { };
然后将您的类放在该命名空间中的某个位置:
class whatever_the_app_is_called.C
#...
如果你使用的是Require.js或node.js,那么他们就有你自己的命名空间模式。