所以我对咖啡脚本相当陌生,必须相当快地学习它才能找到一份新工作。以下代码之间有什么区别:
class Person
相对
class @Person
如果我使用以下
bob = new Person()
结果会有什么不同?
所以我对咖啡脚本相当陌生,必须相当快地学习它才能找到一份新工作。以下代码之间有什么区别:
class Person
相对
class @Person
如果我使用以下
bob = new Person()
结果会有什么不同?
@
是为了this
所以class @Person
编译为this.Person =
...
你可以在coffeescript.org/#try查看编译后的 JS 是什么样子。
如果您查看class C
并class @C
生成的完整 JavaScript,事情应该会更清楚。class C
变成(经过一些清理):
(function() {
var C = (function() {
function C() {}
return C;
})();
}).call(this);
所以C
“类”实际上是自调用函数 (SIF) 包装器中的局部变量。这个包装器是 CoffeeScript 处理范围的一部分:
尽管为了清楚起见在本文档中被隐藏,但所有 CoffeeScript 输出都包装在一个匿名函数中:
(function(){ ... })();
这个安全包装器与var
关键字的自动生成相结合,使得意外污染全局命名空间变得极其困难。
如果我们查看class @C
,我们会看到几乎相同的内容:
(function() {
this.C = (function() {
function C() {}
return C;
})();
}).call(this);
区别在于var C
(局部变量)与this.C
(无论this
是什么的属性)。
那么this
SIF里面有什么?this
内部将是外部的任何内容:
(function() { ... }).call(this)
// -----------------------^^^^
因为call
用于调用 SIF。this
SIF 之外会有什么?window
在浏览器中,它会class @C
等价于class window.C
并且属性window
是全局可见的;因此class @C
将C
在浏览器环境中全局可见,而 simpleclass C
仅在定义它的文件中可见。
一种更常见的方法(至少在我使用过的代码中)是拥有一个全局可见的特定于应用程序的命名空间:
// Somewhere before anything else happens...
window.whatever_the_app_is_called = { };
然后你把你的类放在那个命名空间的某个地方:
class whatever_the_app_is_called.C
#...
如果您使用的是 Require.js 或 node.js,那么它们有自己的命名空间模式供您使用。